野牛解析器无法识别“新”关键字

时间:2018-02-24 00:56:54

标签: c++ c parsing bison yacc

我正在尝试构建一个简单的编译器,我正处于测试我最近通过一些示例 .decaf 文件创建的Bison解析器的阶段,解析器适用于所有关键字和语法终端和非终端令牌/类型以及语法规则和操作的其余部分,但只有一个问题是,当语句包含New关键字时,我的解析器无法识别New关键字/运算符它会导致输出错误!

将New定义为终端令牌

%token   T_New

Expr的CFG语法规则和操作,其中还包括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问题中得到了一些提示,可能是新关键字在C和C ++之间混淆了,这就是为什么它不被bison识别。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你的语法有规则

| T_New Identifier        { ...

匹配New关键字后跟一个标识符。但是,您的示例在标识符周围都有括号:

green = New(Color)

s = new(Rectangle)

因此你看到了语法错误 - 输入有一个(,其中语法需要一个标识符......