실제로, 시스템 레벨 명령어로 컴파일 / 변환 될 수있는 언어의 경우 문맥이없는 문법이어야합니까?
예 : 모든 프로그래밍 / 스크립팅 언어는 무료 문법입니까? Java는 CFG를 기반으로하지만 실제로 모든 프로그래밍 언어가 CFG를 기반으로하는 경우입니까?
필수 사항은 아니지만 이해에는 차이가 있습니다.
질문에 대한 문맥 : 문법 규칙을 제공하는 Java 언어 사양을보고있었습니다 . 이것은 내가이 질문에 대해 생각하게했습니다.
실제로, 시스템 레벨 명령어로 컴파일 / 변환 될 수있는 언어의 경우 문맥이없는 문법이어야합니까?
예 : 모든 프로그래밍 / 스크립팅 언어는 무료 문법입니까? Java는 CFG를 기반으로하지만 실제로 모든 프로그래밍 언어가 CFG를 기반으로하는 경우입니까?
필수 사항은 아니지만 이해에는 차이가 있습니다.
질문에 대한 문맥 : 문법 규칙을 제공하는 Java 언어 사양을보고있었습니다 . 이것은 내가이 질문에 대해 생각하게했습니다.
답변:
두 번 아니
첫째, 대부분의 HPL에는 컨텍스트가 없습니다. 이들은 일반적으로 CFG를 기반으로하는 구문을 가지고 있지만 사람들은 정적 의미론 (구문이라는 용어에도 포함됨)이라고하는 것을 가지고 있습니다. 여기에는 올바른 프로그램을 체크 아웃해야하는 이름과 유형이 포함될 수 있습니다. 예를 들어
class A {
String a = "a";
int b = a + d;
}
구문 상 올바른 Java 프로그램이지만 d
정의 a
되지 않았으며 피팅 유형이 없기 때문에 컴파일 되지 않습니다.
둘째, 컨텍스트가없는 언어를 구문 분석 할 수 있습니다 (컴파일러의 존재로 명백히 입증 됨). CFG를 효율적으로 구문 분석 할 수있는 반면 CSG는 일반적으로 분석 할 수 없습니다. 그러나 효율성을 유지하면서 상황에 맞지 않는 특정 기능을 추가 할 수 있습니다.
컴파일러는 종종 첫 번째 토큰 화 (일반), 컨텍스트가없는 구문 분석, 이름 및 유형 분석 (문맥에 따라, 때로는 더 어려워 짐)의 단계로 실행됩니다. 나타나는 오류 메시지 종류에 따라 해당 동작을 관찰 할 수 있습니다.
public class Program { public static void main(String[] args) { ... } }
... Java는 그렇게 쉽게 벗어날 수 없습니다. :-)
class A { ... }
는 javac
실제로 실행할 수없는 항목 (진입 지점이 없음) 을 컴파일 하기 때문에 충분 합니다. 그러나 그렇습니다.
펄 구문 분석은 결정할 수 없습니다.
파이썬의 문법에 컨텍스트가 없다고 생각하지 않습니다. 동일한 코드 블록의 줄에 같은 들여 쓰기 양이 있어야한다는 것은 컨텍스트 프리 문법이 잘 처리하는 것이 아닙니다.
더 정확하게 말하면, 형태의 파이썬 블록 언어에서 동질성이있는 것으로 보입니다.
조건 인 경우 : line1 line2 line3 그밖에: line4
foo * bar;
선언 foo
에 대한 포인터로 bar
또는 곱셈 foo
시간은 bar
?
Bodo Manthey와 Martin Böhme은 모든 C ++ 컴파일러가 반드시 Turing을 완료했음을 보여줍니다. 즉 컴파일 타임에 부분 재귀 함수를 계산할 수 있습니다 . 따라서 상황에 맞는 것보다 훨씬 나쁩니다.
http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf
변수 를 사용하기 전의 선언 과 OOP 언어 의 함수 다형성 은 컨텍스트 프리 문법으로는 처리 할 수없는 프로그래밍 언어 사양의 다른 예 라고 생각합니다 .
int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...
좀 Google 검색을했고 나는이 문서 발견 " 부울 문법 간단한 부울 언어에 대한 " A.Okhotin하여을 (2004); 그에 따르면 실제 문제는 공식 문법으로 완전히 설명 된 프로그래밍 언어를 찾는 것입니다 .
완구 절차 적 프로그래밍 언어가 정의되고, 이 언어로 잘 구성된 프로그램 세트에 대한 부울 문법 이 구성됩니다. 이것은 분명히 공식 문법에 의한 프로그래밍 언어의 첫 번째 사양입니다.
이 기사의 소개 섹션은 짧지 만 명확합니다.
C의 문법은 기술적으로 컨텍스트가 없다고 생각합니다. 파서는 항상 컨텍스트가없는 기술을 사용하여 Duff의 장치 를 지원 합니다 .
들여 쓰기 기반 언어는 David가 말한 것처럼 자연스럽게 컨텍스트가 없지만 매개 변수화 된 들여 쓰기 토큰에 비해 컨텍스트가 없습니다.
Haskell을 사용하면 연산자 우선 순위를 infix 및 infixl로 변경할 수 있습니다. Perl의 엄격한 pragma 모듈은 어휘 설정 $ ^ H 및 % ^ H를 사용하여 구현되므로 컨텍스트가 없으며 다른 설정도 가능합니다.
TeX와 같은 매크로 확장 언어는 afaik 구문 분석이 실행하지 않으면 의미가 없습니다.
교차점이 문맥이 없지만 여전히 튜링 머신을 설명하는 문맥이없는 문법이 두 개있을 수 있습니다.
Java와 어셈블러는 아마도 자연스럽게 컨텍스트 가 없을 것입니다 .
(a)-b
C의 상황 이 애매 모호하지 않습니까? ( a
변수 또는 typedef 일 수 있습니다-다른 언어에서는 이러한 이유로 단항 빼기 식을 캐스팅 할 수 없습니다)
아닙니다. 많은 실용적인 언어는 문맥에 맞지 않습니다. 예를 들어 C ++ 문법은 그렇지 않습니다. 일부 상황에서는 문법이 문맥에 맞지 않는 정보 입력에 의존하기 때문입니다.
먼저 프로그래밍 언어의 구문과 언어 자체를 구분하겠습니다.
많은 언어의 구문은 (문법에 기초한 CFG (Context Free Grammar))를 잘 연구하고 있으며 CFG를 효율적으로 구문 분석 할 수있는 알고리즘과 CFG로 해결할 수없는 엣지 케이스를 특수하게 처리 할 수 있기 때문에
그러나 많은 언어는 실제로 컨텍스트가 없습니다 (예 : java, C (++), D와 같이 선언 전 사용 기호가 사용되는 경우).
재미있는 사실 : D에는 Turing-complete 컴파일 타임 함수 평가 및 템플릿 확장 기능이있어 언어 자체를 튜링 결정이 불가능합니다. 그러나 언어를 만든 사람은 구문을 CFG로 만들기 위해 많은 노력을 기울였습니다.
"모든 프로그래밍 / 스크립팅 언어는 자유 문법입니까?" 문제는 정답입니다.
Re : "결국 시스템 레벨 명령어로 컴파일 / 변환 될 수있는 언어"에 대한 주요 질문은 왜 이것이 반드시 CFG 여야하는지 모르겠습니다. 그러나 더 나은 설명이 나올 수 있습니다.