【发布时间】:2016-04-18 22:18:17
【问题描述】:
我是 yacc/lex 的绝对初学者,我偶然发现了一些对我来说似乎很简单但我无法理解的东西。我有以下两个规则:S : E; 和 E : STR;(在词法分析器中,[a-z]+ 映射到 STR)。我的猜测是,例如,当我输入“这里”时,输入被消耗并且解析器应该退出,不是吗?
问题是,解析器仍在等待输入,所以不知何故 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; 实际上已被识别并且@ 987654332@被执行。
【问题讨论】: