Я являюсь абсолютным новичком в yacc/lex, и я натыкаюсь на то, что кажется мне простым, но я не могу понять. У меня есть два правила: S : E;
и E : STR;
(и в лексере [a-z]+
отображается на STR
). Я предполагаю, что когда я даю вход «hithere», например, вход потребляется, и парсер должен выйти, нет?Конец правила грамматики в YACC
Дело в том, что синтаксический анализатор все еще ждет ввода, поэтому каким-то образом S : E
не потребляется (или, я думаю,). Если я продолжаю давать ввод, возникает синтаксическая ошибка (что ожидается).
Мой вопрос: в этом случае синтаксический анализатор перестает просить ввода? Может быть, более точно, почему правило S : E;
не удовлетворено для моего конкретного примера?
прилагаю здесь мой .l и мои .Y файлы:
test1.l
:
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
%}
%option noyywrap
%%
[a-z]+ {yylval.str = yytext; return (STR);}
. { ; }
%%
test1.y
:
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
%}
%union {
char *str;
}
%token <str> STR
%type <str> E
%%
S : E {printf("%s\n", $1);}
;
E : STR {$$ = $1;}
;
%%
int yyerror(char *msg) {
printf("%s\n", msg);
return (0);
}
int main() {
yyparse();
return (0);
}
То, что кажется действительно странным мне, что если я введите «hithere», «hithere» будет напечатано на моем терминале, так что это сильный индикатор для меня, что S : E;
действительно был признан и printf()
выполнен.