Lex /野牛不会生成ast 2 + 2

时间:2020-11-12 11:45:06

标签: bison lex

我只是在学习lex / bison / yacc等,并且正在通过名为syntax的库进行运行

这是通过有关UDemy的教程完成的。

我才刚刚开始并尝试使其使其为2 + 2生成AST。看来这应该是微不足道的,但是我无法弄清楚我编写的代码出了什么问题。

它将为数字生成AST,但不会为二进制表达式生成AST。

%lex

%%

\s+       /* skip whitespace */

\d+        return 'NUMBER'

[\+\-]     return 'ADDITIVE_OPERATION'
[\*\/]     return 'MULTIPLICATIVE_OPERATION'

/lex

%%

Expression
  : AdditiveExpression
  ;

AdditiveExpression
  : AdditiveExpression ADDITIVE_OPERATION MultiplicativeExpression
    {
      $$ = {
        type: 'BinaryExpression'
        op: $2,
        left: $1,
        right: $3
      }
    }
  | MultiplicativeExpression
  ;

MultiplicativeExpression
  : MultiplicativeExpression MULTIPLICATIVE_OPERATION PrimaryExpression
    {
      $$ = {
        type: 'BinaryExpression'
        op: $2,
        left: $1,
        right: $3
      }
    }
  | PrimaryExpression
  ;

PrimaryExpression
  : Literal
  | ParenthesizedExpression
  ;

Literal
  : NumericLiteral
  ;

NumericLiteral
  : NUMBER 
    {
      $$ = {
        type: 'NumericLiteral',
        value: Number($1)
      }
    }
  ;

ParenthesizedExpression
  : '(' Expression ')' { $$ = $2 }
  ;

然后和我运行的syntax-cli

syntax-cli --grammar grammer/noa.bnf --mode LALR1 --parse '2 + 2' --debug

我回来了:

Parsed value:

{
  "type": "NumericLiteral",
  "value": 2
}

它应该生成一个binaryExpression,其中包含numericLiteral s。

我尝试删除ADDITIVE_OPERATOR并将其替换为+,所以我认为[\+\-]正则表达式不是问题。我还仔细检查了regexr中的正则表达式。

我知道NumericLiteral是正确的,因为它可以解析它。它只是不会抓住AdditiveExpression

1 个答案:

答案 0 :(得分:1)

您在某些对象文字中缺少逗号(特别是在type: BinaryExpression出现两次之后)。

syntax模式下,--parse似乎完全忽略了具有语法错误的操作。如果您实际上使用--output将语法编译为JavaScript,那么当您尝试使用node运行生成的文件时,会收到一个实际的语法错误,告诉您错误在哪里。

相关问题