Compiler construction 莱克斯+;YACC为规则在下一行获取令牌 我试图为我自己的迷你语言构建一个解析器,然后用YACC自己翻译成C++。p>

Compiler construction 莱克斯+;YACC为规则在下一行获取令牌 我试图为我自己的迷你语言构建一个解析器,然后用YACC自己翻译成C++。p>,compiler-construction,bison,flex-lexer,yacc,lex,Compiler Construction,Bison,Flex Lexer,Yacc,Lex,问题是,YACC正在读取第一行输入以及第二行输入中的第一个令牌,并将其与相应的规则匹配,而它应该只读取第一行输入中的令牌,并将其与相应的规则匹配 我的输入文件是: print "hello" a = 10 print a Lex文件: %{ #include <stdio.h> #include "y.tab.h" %} alpha [a-zA-Z] digit [0-9] %% [ \t] ; [

问题是,YACC正在读取第一行输入以及第二行输入中的第一个令牌,并将其与相应的规则匹配,而它应该只读取第一行输入中的令牌,并将其与相应的规则匹配

我的输入文件是:

print "hello"
a = 10
print a
Lex文件:

%{
    #include <stdio.h>
    #include "y.tab.h"  
%}

alpha   [a-zA-Z]
digit   [0-9]

%%
[ \t]                           ;
[ \n]                           { yylineno = yylineno + 1;}
print                           {yylval = strdup(yytext); return PRINT;}
{alpha}({alpha}|{digit})*       {yylval = strdup(yytext); return ID;}
{digit}+                        {yylval = strdup(yytext); return INTEGER;}
\".*\"                          {yylval = strdup(yytext); return STRING;}
"="                             return ASSIGN;
%%
用于减少的规则应该是(按相同顺序):

但是,用于降低成本的第一条规则是:

PRINT STRING ID
解析失败

ID
位于下一行,在
PRINT STRING
之后,但使用的规则仍然是
PRINT STRING ID

我给
STRING
的优先级低于
ID
(我猜下面的代码就是这个意思)

这就是问题所在吗


我无法理解发生了什么事。我遗漏了什么吗?

您有效的打印操作之一是

PRINT STRING ID
您的输入与此操作匹配,但紧接着此输入的是一个=符号,解析器无法将其作为任何其他操作的开始匹配


似乎你想用新线来界定你的行动。因此,您需要显式地创建一个操作结束标记,更新语法,使您的操作以该标记结束,并让lexer在看到换行符时生成该标记。

您的意思是,返回一个标记,对每一行说换行符,\n并使用诸如PRINT STRING newline和ID ASSIGN INTEGER newline之类的规则?@Abhilashk-是的,完全正确
cout<<"hello"<<a<<endl;
Line: 2, Message: syntax error, Cause: =
PRINT STRING
ID ASSIGN INTEGER
PRINT ID
PRINT STRING ID
%nonassoc STRING
%nonassoc ID
PRINT STRING ID