Compiler construction 莱克斯+;YACC为规则在下一行获取令牌 我试图为我自己的迷你语言构建一个解析器,然后用YACC自己翻译成C++。p>
问题是,YACC正在读取第一行输入以及第二行输入中的第一个令牌,并将其与相应的规则匹配,而它应该只读取第一行输入中的令牌,并将其与相应的规则匹配 我的输入文件是: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] ; [
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