gpt4 book ai didi

c++ - Bison 解析器无法识别 "New"关键字

转载 作者:行者123 更新时间:2023-11-30 20:58:58 27 4
gpt4 key购买 nike

我正在尝试构建一个简单的编译器,并且正在测试我最近在一些示例 .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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com