Опитах няколко различни генератора на анализатори (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 и %merge успях да накарам Bison да обработва двусмислени правила и терминали, но той все още се задушава от много прости, но силно патологични псевдоанглийски граматики от вида, с който трябва да се справя:
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";
С вход „момче видя момиче“, Bison не може да анализира и се връща с код 1. Том, от друга страна, се справя безупречно с тази граматика и това въведено изречение и дори естествено обработва непознати терминали, като просто ги присвоява на всички възможни типове терминали. Но за разлика от Bison, Tom се задавя от големи граматики. (Под „дросели“ имам предвид откази по различни различни начини. Ако режимите на отказ биха били полезни, мога да ги докладвам.)
Някой има ли други идеи?