2017-05-23 3 views
2

나는 C는 문맥 자유 언어, 유명한 예는 아니라고 알고 typedef.C 언어를 문맥 자유롭게 만드는 방법은 무엇입니까? 3 라인 <code>foo</code>은, 식별자, 또는 여부, 렉서 모르는이 경우</p> <pre><code>int foo; typedef int foo; foo x; </code></pre> <p>:

내 질문이 C상황에 맞는 언어를 만드는 유일한 이유는, 무엇입니까?

즉, typedef을 제거하면 문맥이없는 언어가됩니까? 아니면 그렇게하지 못하게하는 다른 이유 (예)가 있습니까?

+0

그런 것들을 제거하면 더 이상 C가 없지만 C와 비슷한 (그러나 호환되지는 않음) 완전히 새로운 언어가됩니다. –

+0

'+'는 컨텍스트에 따라 다릅니다 :'40 + 2'에서 의미합니다 정수 추가; '40 + 2.0'에서는 부동 소수점 덧셈을 의미합니다. – pmg

+2

@pmg 파서는 어떤 종류의 것들이 중요하지 않습니다. – sepp2k

답변

4

예. C는 고전적인 lex + yacc 콤보로 파싱 될 수 있습니다. 렉서의 정의와 yacc에 문법을 사용하면 렉스 파일에서 볼 수 있듯이

http://www.quut.com/c/ANSI-C-grammar-l-2011.htmlhttp://www.quut.com/c/ANSI-C-grammar-y-2011.html

에서 자유롭게 사용할 수 있습니다, 그것은 상황에 맞는 check_type() (그리고 comment() 있지만, 주석 처리를 제외하고 간단합니다 기술적으로 전처리기에 속함), typedef이 컨텍스트 감도의 유일한 원천이됩니다. yacc 파일에는 상황 감도 도입 트릭이 포함되어 있지 않으므로 typedef -less C는 컨텍스트가없는 완벽한 언어입니다.

+0

전처리 기 :-)를 무시하면 – rici

0

아니요. C는 엄격한 컨텍스트 독립 언어 일 수 없습니다. 이를 위해, 당신은 당신의 질문에서 기술 한 것과 비슷한 방식으로 선언되지 않은 변수 (문맥)를 사용할 수없는 구문을 기술해야합니다. 언어 작성자는 일종의 문맥 자유 문법을 사용하여 구문을 설명하지만 언어의 주요 구문 구문을 설명하기 만합니다. 설명하는 경우 (다른 토큰 클래스에 들어갈 수있는 유형 식별자를 만들어서는 안되는 장소로 이동할 수 있음)는 하나의 예일뿐입니다. 예를 들어, static unsigned long long int variable과 같은 순서의 자유는 프로그래머가 기억하는 구문을 단순화하지만 컴파일러 작성자에게는 복잡한 작업입니다.

관련 문제