Bison 解析器无法识别 "New" 关键字
Bison parser doesn't recognize the "New" keyword
我正在尝试构建一个简单的编译器,我正处于测试我最近在一些示例 .decaf 文件上创建的 Bison 解析器的阶段,该解析器适用于所有关键字和语法的终结符和非终结符 tokens/types 以及其余的语法规则和操作,但只有一个问题是我的解析器无法识别 New
keyword/operator,每当语句包含一个 New
关键字,它会导致输出错误!
将 New 定义为终端标记
%token T_New
Expr
的 CFG 语法规则和操作还包括 T_New
的规则和操作
Expr : LValue '=' Expr { $$=new AssignExpr(,new Operator(@2,"="),); }
| '(' Expr ')' { $$=; }
| Expr '+' Expr { $$=new ArithmeticExpr(,new Operator(@2,"+"),); }
| Expr '-' Expr { $$=new ArithmeticExpr(,new Operator(@2,"-"),); }
| Expr '*' Expr { $$=new ArithmeticExpr(,new Operator(@2,"*"),); }
| Expr '/' Expr { $$=new ArithmeticExpr(,new Operator(@2,"/"),); }
| Expr '%' Expr { $$=new ArithmeticExpr(,new Operator(@2,"%"),); }
| '-' Expr %prec T_UnaryMinus { $$=new ArithmeticExpr(new Operator(@1,"-"),); }
| Expr T_And Expr { $$=new LogicalExpr(,new Operator(@2,"&&"),); }
| Expr T_Or Expr { $$=new LogicalExpr(,new Operator(@2,"||"),); }
| Expr '<' Expr { $$=new RelationalExpr(,new Operator(@2,"<"),); }
| Expr T_LessEqual Expr { $$=new RelationalExpr(,new Operator(@2,"<="),); }
| Expr '>' Expr { $$=new RelationalExpr(,new Operator(@2,">"),); }
| Expr T_GreaterEqual Expr { $$=new RelationalExpr(,new Operator(@2,">="),); }
| Expr T_Equal Expr { $$=new EqualityExpr(,new Operator(@2,"=="),); }
| Expr T_NotEqual Expr { $$=new EqualityExpr(,new Operator(@2,"!="),); }
| '!' Expr { $$=new LogicalExpr(new Operator(@1, "!"), ); }
| T_ReadInteger '(' ')' { $$=new ReadIntegerExpr(@1); }
| T_ReadLine '(' ')' { $$=new ReadLineExpr(@1); }
| T_New Identifier { $$=new NewExpr(@2,new NamedType()); }
| T_NewArray '(' Expr ',' Type ')' { $$=new NewArrayExpr(@1,,); }
| LValue { $$=; }
| T_This { $$=new This(@1); }
| Call { $$=; }
| Constant { $$=; }
;
例如,我有这个示例文件 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' 关键字 returns 的语句的文件都会出现相同的错误。
我从 this 问题中得到一些提示,可能 New 关键字在 C 和 C++ 之间混淆了,这就是为什么它不能被 bison 识别。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?
你的语法有规律
| T_New Identifier { ...
匹配 New
关键字,紧接着是标识符。但是,您的示例在标识符周围都有括号:
green = New(Color)
s = new(Rectangle)
因此您看到的语法错误 -- 输入有一个 (
语法需要一个标识符...
我正在尝试构建一个简单的编译器,我正处于测试我最近在一些示例 .decaf 文件上创建的 Bison 解析器的阶段,该解析器适用于所有关键字和语法的终结符和非终结符 tokens/types 以及其余的语法规则和操作,但只有一个问题是我的解析器无法识别 New
keyword/operator,每当语句包含一个 New
关键字,它会导致输出错误!
将 New 定义为终端标记
%token T_New
Expr
的 CFG 语法规则和操作还包括 T_New
Expr : LValue '=' Expr { $$=new AssignExpr(,new Operator(@2,"="),); }
| '(' Expr ')' { $$=; }
| Expr '+' Expr { $$=new ArithmeticExpr(,new Operator(@2,"+"),); }
| Expr '-' Expr { $$=new ArithmeticExpr(,new Operator(@2,"-"),); }
| Expr '*' Expr { $$=new ArithmeticExpr(,new Operator(@2,"*"),); }
| Expr '/' Expr { $$=new ArithmeticExpr(,new Operator(@2,"/"),); }
| Expr '%' Expr { $$=new ArithmeticExpr(,new Operator(@2,"%"),); }
| '-' Expr %prec T_UnaryMinus { $$=new ArithmeticExpr(new Operator(@1,"-"),); }
| Expr T_And Expr { $$=new LogicalExpr(,new Operator(@2,"&&"),); }
| Expr T_Or Expr { $$=new LogicalExpr(,new Operator(@2,"||"),); }
| Expr '<' Expr { $$=new RelationalExpr(,new Operator(@2,"<"),); }
| Expr T_LessEqual Expr { $$=new RelationalExpr(,new Operator(@2,"<="),); }
| Expr '>' Expr { $$=new RelationalExpr(,new Operator(@2,">"),); }
| Expr T_GreaterEqual Expr { $$=new RelationalExpr(,new Operator(@2,">="),); }
| Expr T_Equal Expr { $$=new EqualityExpr(,new Operator(@2,"=="),); }
| Expr T_NotEqual Expr { $$=new EqualityExpr(,new Operator(@2,"!="),); }
| '!' Expr { $$=new LogicalExpr(new Operator(@1, "!"), ); }
| T_ReadInteger '(' ')' { $$=new ReadIntegerExpr(@1); }
| T_ReadLine '(' ')' { $$=new ReadLineExpr(@1); }
| T_New Identifier { $$=new NewExpr(@2,new NamedType()); }
| T_NewArray '(' Expr ',' Type ')' { $$=new NewArrayExpr(@1,,); }
| LValue { $$=; }
| T_This { $$=new This(@1); }
| Call { $$=; }
| Constant { $$=; }
;
例如,我有这个示例文件 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' 关键字 returns 的语句的文件都会出现相同的错误。
我从 this 问题中得到一些提示,可能 New 关键字在 C 和 C++ 之间混淆了,这就是为什么它不能被 bison 识别。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?
你的语法有规律
| T_New Identifier { ...
匹配 New
关键字,紧接着是标识符。但是,您的示例在标识符周围都有括号:
green = New(Color)
s = new(Rectangle)
因此您看到的语法错误 -- 输入有一个 (
语法需要一个标识符...