순열 구문은 표준 (E) BNF 컨텍스트 프리 문법 정의의 확장입니다. 순열 구문 에는 n 개의 프로덕션 (또는 이와 동일하게 비 터미널) A 1 - A n이 포함 됩니다. 순열 구의 위치에서, 우리는이 작품들 모두를 정확히 한 번보고 싶어하지만,이 비 터미널의 순서에는 관심이 없습니다.
예를 들면 다음과 같습니다.
S <- X { A, B, C } Y
다음과 같습니다.
S <- X A B C Y
S <- X A C B Y
S <- X B A C Y
S <- X B C A Y
S <- X C A B Y
S <- X C B A Y
이 개념은 "순열 구를 사용하여 문맥없는 문법 확장" 에서 소개 된 것으로 보입니다 . 여기에는 LL (1) 파서를 사용하여 이러한 구문을 선형 시간으로 구문 분석하는 방법도 설명되어 있습니다.
백서 "구문 분석 구문 분석"은 구문 분석기 조합기를 사용하여 순열 구문을 구문 분석하는 방법을 설명합니다. 이것들은 순열 구와 구문 분석 방법에 대해 이야기 한 유일한 두 논문입니다.
이러한 종류의 순열 구문을 LL (1) 기반 파서로 쉽게 구문 분석 할 수 있다는 것을 알면 LR (1) 스타일 파서로 동일한 작업을 수행 할 수있을 것입니다. 내 질문은 따라서 :
순열 구문을 포함하는 문법을 합리적인 크기의 테이블을 유지하면서 LR (1) 기계를 사용하여 입력 문자열 크기에서 시간 선형으로 구문 분석 할 수 있습니까?
순열 구는 문맥이없는 언어의 힘을 확장하지 않습니다. 위의 예에서와 같이 가능한 모든 순열을 간단히 열거 할 수 있습니다. 그러나 결과 문법의 크기가 수 있으므로 문법이 폭발합니다 . 이를 통해 선형 시간 구문 분석이 가능하지만 문법 크기가 너무 커집니다.
위의 접근 방식은 모든 구문 분석 알고리즘에서 작동하므로 (유용하지는 않지만) 특정 알고리즘에 대해 더 잘 수행 할 수 있습니다. 구문을 LR 테이블로 인코딩 하여 블로우 업을 '단순하게'지수 ( )로 줄일 수 있습니다. 순열 구.
이 방법이 더 좋지만 물론 충분하지는 않습니다. 순열 문구가 30 개이면 문법을 사용할 수 없게됩니다. 아직 다루지 않은 LR 파싱의 한 부분이 여전히 있으며, 파싱에 사용되는 실제 스택 기반 절차입니다. 스택에 카운터를 저장하면 문제를 해결할 수 있다고 생각하지만 어떻게 해야할지 모르겠습니다.
나는 현재 파서 생성기를 구현하고 있으며 문제 영역에서 순열 구는 천국의 선물이 될 것입니다. LR (1) 기계를 사용함에 따라 위의 질문이 이어졌습니다.