我正在尝试构建一个简单的编译器,我正处于测试我最近通过一些示例 .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问题中得到了一些提示,可能是新关键字在C和C ++之间混淆了,这就是为什么它不被bison识别。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?
答案 0 :(得分:1)
你的语法有规则
| T_New Identifier { ...
匹配New
关键字后跟一个标识符。但是,您的示例在标识符周围都有括号:
green = New(Color)
s = new(Rectangle)
因此你看到了语法错误 - 输入有一个(
,其中语法需要一个标识符......