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)

因此您看到的语法错误 -- 输入有一个 ( 语法需要一个标识符...