【发布时间】:2018-08-04 02:59:19
【问题描述】:
我正在尝试构建一个简单的编译器,我正在测试我最近在一些示例 .decaf 文件上创建的 Bison 解析器,该解析器适用于所有关键字和语法的终端和非终端标记/类型以及其余的语法规则和操作,但只有一个问题是我的解析器无法识别 New 关键字/运算符,当一条语句包含 New 关键字时,它会导致输出错误!
将 New 定义为终端令牌
%token T_New
Expr 的 CFG 语法规则和操作,还包括 T_New 的规则和操作
Expr : LValue '=' Expr { $$=new AssignExpr($1,new Operator(@2,"="),$3); }
| '(' Expr ')' { $$=$2; }
| Expr '+' Expr { $$=new ArithmeticExpr($1,new Operator(@2,"+"),$3); }
| Expr '-' Expr { $$=new ArithmeticExpr($1,new Operator(@2,"-"),$3); }
| Expr '*' Expr { $$=new ArithmeticExpr($1,new Operator(@2,"*"),$3); }
| Expr '/' Expr { $$=new ArithmeticExpr($1,new Operator(@2,"/"),$3); }
| Expr '%' Expr { $$=new ArithmeticExpr($1,new Operator(@2,"%"),$3); }
| '-' Expr %prec T_UnaryMinus { $$=new ArithmeticExpr(new Operator(@1,"-"),$2); }
| Expr T_And Expr { $$=new LogicalExpr($1,new Operator(@2,"&&"),$3); }
| Expr T_Or Expr { $$=new LogicalExpr($1,new Operator(@2,"||"),$3); }
| Expr '<' Expr { $$=new RelationalExpr($1,new Operator(@2,"<"),$3); }
| Expr T_LessEqual Expr { $$=new RelationalExpr($1,new Operator(@2,"<="),$3); }
| Expr '>' Expr { $$=new RelationalExpr($1,new Operator(@2,">"),$3); }
| Expr T_GreaterEqual Expr { $$=new RelationalExpr($1,new Operator(@2,">="),$3); }
| Expr T_Equal Expr { $$=new EqualityExpr($1,new Operator(@2,"=="),$3); }
| Expr T_NotEqual Expr { $$=new EqualityExpr($1,new Operator(@2,"!="),$3); }
| '!' Expr { $$=new LogicalExpr(new Operator(@1, "!"), $2); }
| T_ReadInteger '(' ')' { $$=new ReadIntegerExpr(@1); }
| T_ReadLine '(' ')' { $$=new ReadLineExpr(@1); }
| T_New Identifier { $$=new NewExpr(@2,new NamedType($2)); }
| T_NewArray '(' Expr ',' Type ')' { $$=new NewArrayExpr(@1,$3,$5); }
| LValue { $$=$1; }
| T_This { $$=new This(@1); }
| Call { $$=$1; }
| Constant { $$=$1; }
;
例如我有这个示例文件interface.decaf 用于测试,它的主要功能如下:
void main() {
Colorable s;
Color green;
green = New(Color);
green.SetRGB(0, 0, 255);
s = New(Rectangle);
s.SetColor(green);
}
但是当我在终端中对这个示例文件运行解析器时,我得到了这个错误:
*** Error line 33.
green = New(Color);
*** syntax error
我尝试使用其他示例文件并注意到任何包含提及“New”关键字的语句的文件都会返回相同的错误。
我从this 问题中得到了一些提示,可能 New 关键字在 C 和 C++ 之间混用了,这就是为什么野牛无法识别它的原因。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?
【问题讨论】:
-
是的@Walter 我说的是
new,但是我为这个项目拥有的示例文件使用New(第一个字母大写),你可以在代码sn-p中看到它来自文件 -
您的词法分析器是否在某个时候返回了标记
T_New?发现T_new时,您可能忘记在bison 中添加规则? -
如果您的词法分析器正在返回令牌,那么我唯一能想到的就是您的野牛文件中没有匹配令牌的规则,或者您的规则不正确。
-
Identifier是什么?是否匹配(、Color、)? -
好吧,规则
Expr : T-New Identifier不会匹配New(Name)因为括号。该信息应该在问题中(语法片段)-如果您犯了这种错误并且没有向我们展示语法,我们无法诊断您做错了什么。阅读有关如何创建 MCVE (minimal reproducible example) 的信息。 Bison + Flex (flex-lexer) 更难,但是……