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

标签 c++ c parsing bison yacc

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

相关文章:

c++ - 模板匹配与模板更新

c++ - ubuntu 13.04 上的 Eclipse C++ 插件

解析维基百科国家、地区、城市

java - SAX + Java 的奇怪 characters() 行为

parsing - 解析和检查 Haskell 代码的库?

c++ - 为什么不能将引用和指针一起使用?

c++ - 如何在 QT 中将函数 "go back"编程为 MainWindow 的菜单栏选项?

c - 我想消除我在程序中绘制的表格的重复外观。有没有办法可以将其放入单独的函数中?

c - msync 中标志 MS_INVALIDATE 的确切含义是什么?

c - 在 C 程序中使用未完成进程的输出