【问题标题】:Bison parser doesn't recognize the "New" keyword [closed]Bison 解析器无法识别“New”关键字 [关闭]
【发布时间】:2018-08-04 02:59:19
【问题描述】:

我正在尝试构建一个简单的编译器,我正在测试我最近在一些示例 .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 问题中得到了一些提示,可能 New 关键字在 C 和 C++ 之间混用了,这就是为什么野牛无法识别它的原因。但我仍然无法弄清楚如何解决这个问题!有人可以帮忙吗?

【问题讨论】:

  • 是的@Walter 我说的是new,但是我为这个项目拥有的示例文件使用New(第一个字母大写),你可以在代码sn-p中看到它来自文件
  • 您的词法分析器是否在某个时候返回了标记 T_New?发现T_new 时,您可能忘记在bison 中添加规则?
  • 如果您的词法分析器正在返回令牌,那么我唯一能想到的就是您的野牛文件中没有匹配令牌的规则,或者您的规则不正确。
  • Identifier 是什么?是否匹配(Color)
  • 好吧,规则 Expr : T-New Identifier 不会匹配 New(Name) 因为括号。该信息应该在问题中(语法片段)-如果您犯了这种错误并且没有向我们展示语法,我们无法诊断您做错了什么。阅读有关如何创建 MCVE (minimal reproducible example) 的信息。 Bison + Flex (flex-lexer) 更难,但是……

标签: c++ c parsing bison yacc


【解决方案1】:

你的语法有一个规则

| T_New Identifier        { ...

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

green = New(Color)

s = new(Rectangle)

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

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多