Я пытаюсь написать грамматический распознаватель, используя flex и bison, чтобы определить, находится ли входная строка в L (G), где язык представляет собой объединение:
L (G) = {a ^ib ^ jc ^ kd ^ le ^ m}, где i, j, k, l, m> 0 и i = m и k = l
и
L (G) = {e^ id ^ jc ^ kb ^ la ^ m} где i, j, k, l, m> 0 и i = 2m k = 3l и j = 2
Сейчас у меня все работает нормально, но толькопри использовании токенов на языках. Если я добавлю любой другой токен, он, кажется, будет проигнорирован, и тест пройден или не пройден на основе других разрешенных токенов. Это проблематично, поскольку допускает прохождение синтаксического анализа такими строками, как «abcdef», даже если «f» отсутствует в языке.
Ошибочный ввод, который я сейчас проверяю, - это «abcdef». Часть «abcde» является правильной и дает правильный вывод, но добавление «f» в конец вызывает как сообщение об ошибке синтаксиса от yyerror («ошибка синтаксиса»), так и оператор печати «поздравления; синтаксический анализ выполнен успешно» от main кprint.
Использование "fabcde" делает то же самое, что я описал выше. Это дает мне ошибку, но также дает мне вывод на печать. Я использую «if (yyparse () == 0))», чтобы напечатать утверждение об успехе в main, и я думаю, что это может быть причиной, хотя у меня были те же проблемы, когда я перемещал операторы print в. y файл и только что использованный yyparse () и return (1) в main.
Вот мой файл .in (за исключением минус):
%%
a return A;
b return B;
c return C;
d return D;
e return E;
. yyerror("syntax error\n\nSorry, Charlie, input string not in L(G)\n"); /* working but still prints success message too */
%%
Вот мой файл .y (минусвключает в себя):
%token A
%token B
%token C
%token D
%token E
%% /* Grammar Rules */
string: as bs cs ds es
{
if(($1 == $5) && ($3 == $4)) {
return(0);
}
else
{
return(-1);
}
}
;
string: es ds cs bs as
{
if(($1 == (2 * $5) && ($3 == (3 * $4)) && ($2 = 2)) {
return(0);
}
else
{
return(-1);
}
}
;
as: A as {$$ = $2 +1;}
;
as: A {$$ = 1;}
;
bs: B bs {$$ = $2 +1;}
;
bs: B {$$ = 1;}
;
cs: C cs {$$ = $2 +1;}
;
cs: C {$$ = 1;}
;
ds: D ds {$$ = $2 +1;}
;
ds: D {$$ = 1;}
;
es: E es {$$ = $2 +1;}
;
es: E {$$ = 1;}
;
%%
мой файл .c прост и просто возвращает «поздравления; синтаксический анализ успешен», если yyparse () == 0, и «входная строка не в L (G)» в противном случае.
Все прекрасно работает, когда входные строки включают только a, b, c, d и e. Мне просто нужно выяснить, как заставить синтаксический анализатор выдавать синтаксическую ошибку без оператора успеха, если в строке ввода есть какой-либо токен, кроме них.
Вот изображение, которое поможет показать мою проблему: Первые два разбора работают как задумано. Третий показывает мою проблему.