저는 GLR 파서를 생성 할 수 있다고 주장하는 여러 파서 생성기 (Bison, DParser 등)를 시도했습니다. 즉, 모호한 문법을 처리 할 수있는 파서 생성기를 시도했습니다. 저는 여기에 대해서 이야기 형식의 매우 간단한 모호한 문법입니다 :왜 이렇게 간단한 문법 때문에 GLR 파서가 질식합니까?
START: A | B;
A: C | D;
B: C | D;
C: T1 | T2;
D: T3 | T4;
T1: 't1';
T2: 't2';
T3: 't3';
T4: 't4';
내가 잘 파서를 생성 할 수 있습니다,하지만 내가 파서 입력을 줄 때 나는 "해결되지 않은 모호함"오류 또는 단지 명백한 충돌을 얻을 유효해야합니다. 문법을 모호하지 않은 버전으로 변경하면 아무런 문제가 없습니다.
GLR 파서에 대해 이해할 수없는 점은 무엇입니까? 모호함이있는 경우 모든 가능한 구문 분석은 합병되거나 막 다른 골목에 도달 할 때까지 추적됩니다. 필요한 것은 입력의 유효한 구문 분석 여부를 알려주는 파서입니다.
도움 주셔서 감사합니다.
편집 :
이것은 실망 스럽습니다. 내가 모호한 규칙과 단말기를 처리하기 위해 들소를 얻을 수있었습니다,하지만 여전히 내가 처리해야 할 종류의 매우 간단하지만 매우 병리학 의사 영어 문법에 초크 %의 dprec 및 %의 병합 사용 :
S: NP VP | NPA VP;
NPA: D N | NP PP;
NP: D N | NP PP | NPA;
VP: V NP | VP PP;
PP: P NP;
D: "the" | "a";
P: "in" | "with";
V: "saw";
N: "saw" | "girl" | "boy" | "park" | "telescope";
"소년이 소녀를 봤다"라는 문구가 있으면 바이손은 코드 1로 구문 분석하고 반환 할 수 없습니다. 반면에 Tom은이 문법과이 입력 문장을 완벽하게 처리하며 모든 사람에게 가능한 터미널 유형. 그러나 Bison과 달리 Tom은 큰 문법을 사용합니다. ("쵸크"란 여러 가지 다른 방식으로 실패합니다. 고장 모드가 도움이된다면, 그것들을보고 할 수 있습니다.)
누구든지 다른 아이디어가 있습니까?
답장을 보내 주셔서 감사합니다. Bison과 DParser에게 모호성을 해결하는 방법을 말하면서 더 자세히 살펴볼 것입니다. 다행히도 나는 다음과 같이 말할 수있다 : if (모호성) {아무것도하지 않는다; } 그동안, 저는 Tom이라고 불리는이 고대의 작은 (약 700 줄의 순수한 C) 파서를 발견했습니다 (http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/nlp)./구문 분석/톰 /) 지금까지 내가 완벽하게 그것에 던져 모든 것을 처리합니다. 아마도 Bison과 같은 많은 애호가들은 효율적 파싱에 관심이 많기 때문에 훨씬 커야 할 것입니다. – user3268289
@ user3268289 : 두 경우 모두 모호성이있는 경우에만 모호성 루틴이 호출되며 아무 것도 수행 할 수 없습니다. 그래서 예, 꽤 간단합니다. 바이슨은 물론 효율성에 관심이있는 반면, 행동의 주된 이유는 컴파일/해석 목적으로 실제 언어를 파싱하는 것과 관련이 있으며, 일반적으로 모호하지 않은 구문 분석이 필요하다는 것입니다. '% dprec' 솔루션은 많은 타이핑이지만 그 외에는 사소한 것입니다; '% dprec N '을 모든 프로덕션의 끝에 추가하십시오. 여기서'N'은 고유 정수입니다 (예를 들어 순차적으로 지정할 수 있습니다.) – rici
Rici, 당신의 아이디어는 좋았고, Bison은 더러운 문법을 개선했습니다. 위의 원래 질문의 두 번째 예와 같이 일부 경우에는 여전히 작동하지 않습니다. – user3268289