私はyacc/lexの絶対初心者です。私は単純なように思えますが、理解できません。私は以下の2つの規則を持っています:S : E;
とE : STR;
(そしてレクサーでは[a-z]+
はSTR
にマップされます)。私の推測では、入力を "ヒーティング"にすると、入力が消費され、パーサが終了するはずです。YACCの文法規則の終わり
パーザはまだ入力を待っていますので、なんとかS : E
は消費されません。入力を続けていると、構文エラーが発生します(これは予想されます)。
私の質問は、パーサーが入力を求めないのですか?より正確には、具体的な例として、規則S : E;
が満足していないのはなぜですか?
test1.l
:
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
%}
%option noyywrap
%%
[a-z]+ {yylval.str = yytext; return (STR);}
. { ; }
%%
test1.y
:
私はここに私.Lと私.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);
}
私には本当に奇妙なようだ
事がある、もしI入力が "ヒット"、 "ヒット"が端末に印刷されているので、実際にはと認識されていることがわかりますが実行されました。