나는 언어 파서가 Chomsky Hierarchy에 어떻게 맞는지에 관해 최근에 언어 파서의 개발을 탐구하는 것을 즐겼습니다.
상황에 맞는 문법의 실제 (예 : 이론적이지 않은) 예는 무엇입니까?
나는 언어 파서가 Chomsky Hierarchy에 어떻게 맞는지에 관해 최근에 언어 파서의 개발을 탐구하는 것을 즐겼습니다.
상황에 맞는 문법의 실제 (예 : 이론적이지 않은) 예는 무엇입니까?
답변:
좋은 질문. 주석에서 언급 한 바와 같이 매우 많은 프로그래밍 언어가 문맥에 민감하지만, 그 문맥 민감도는 종종 구문 분석 단계에서 해결되지 않지만 이후 단계에서, 즉 문맥의 문법을 사용하여 언어의 수퍼 세트가 구문 분석됩니다 파싱 트리 중 일부는 나중에 필터링됩니다.
그러나 이것이 해당 언어가 상황에 맞지 않다는 것을 의미하지는 않으므로 여기에 몇 가지 예가 있습니다.
Haskell을 사용하면 연산자로 사용되는 함수를 정의하고 해당 연산자의 우선 순위 및 연관성을 정의 할 수 있습니다. 즉, 다음과 같은 연산자 표현식에 올바른 구문 분석 트리를 작성할 수 없습니다.
a @@ b @@ c ## d ## e
당신은 이미에 대한 우선 순위 / 연관성 선언을 구문 분석하지 않았다면 @@
및 ##
:
infixr 8 @@
infixr 6 ##
두 번째 예는 콘텐츠에 길이가 접두사 인 데이터 언어 인 Bencode입니다 .
<length>:<contents>
이 형식의 문제는 "필드"크기를 알아내는 유일한 방법은 ... 문자열을 구문 분석하는 것이므로 컨텍스트에 민감한 것이 없으면 구문 분석이 거의 불가능하다는 것입니다.
세 번째 예는 임의의 태그 이름이 허용된다고 가정 할 때 XML입니다. 여는 태그 이름에는 일치하는 닫기 태그가 있어야합니다.
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
내가 아는 한 상황에 맞는 문법은 자연어 처리 에만 사용됩니다 . 프로그래밍 언어 인터프리터와 컴파일러는 복잡성으로 인해 컨텍스트가없는 문법을 구문 분석하려고하지 않습니다 (과거에 일부 시도가 수행 된 경우에도).
다음 라이브러리 중 하나에서 실제 사용 예를 찾을 수 있습니다.
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
상황에 맞는 문법은 때때로 프로그래밍 언어 의미론의 설명에 사용됩니다. 상황에 맞는 문법의 가장 포괄적 인 사용은 Algol68 언어 정의 일 것입니다. Algol68 프로그램의 구문과 의미를 설명 하기 위해 2 단계 컨텍스트 프리 그래머 ( http://en.wikipedia.org/wiki/Two-level_grammar 참조 )를 사용했습니다.
내 동료 몇 명이 van Wijngaarden 문법을 사용하여 Algol68을 구현하도록 지시했습니다 ( http://en.wikipedia.org/wiki/FLACC 참조 ).