我正在尝试构建一个简单的编译器,并且正在测试我最近在一些示例 .decaf 文件上创建的 Bison 解析器,该解析器可以很好地处理所有关键字和语法的终端和非终结符/类型以及语法规则和操作的其余部分,但只有一个问题是我的解析器无法识别 New
关键字/运算符,当语句包含 New
时关键字会导致输出错误!
将 New 定义为终端 token
%token T_New
Expr
的CFG语法规则和 Action 其中还包括 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++ 之间混合,这就是为什么它不被 bison 识别的原因。但我仍然不知道如何解决这个问题!有人可以帮忙吗?
最佳答案
你的语法有一个规则
| T_New Identifier { ...
匹配 New
关键字,后跟标识符。但是,您的示例都在标识符周围带有括号:
green = New(Color)
s = new(Rectangle)
因此您看到的语法错误 - 输入有一个 (
,其中语法需要一个标识符...
关于c++ - Bison 解析器无法识别 "New"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48958265/