Lex / bison 不会生成 ast 2 + 2

Lex / bison won't generate an ast 2 + 2

我正在学习 lex/bison/yacc 等等,我正在 运行 通过一个名为 syntax

的库来学习它

这是通过 UDemy 上的教程实现的。

我刚刚开始尝试让它为 2 + 2 生成 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: ,
        left: ,
        right: 
      }
    }
  | MultiplicativeExpression
  ;

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

PrimaryExpression
  : Literal
  | ParenthesizedExpression
  ;

Literal
  : NumericLiteral
  ;

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

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

然后用 syntax-cli 我 运行

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

我回来了:

Parsed value:

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

它应该生成一个 binaryExpression,里面有 numericLiteral

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

中的正则表达式

我知道 NumericLiteral 是正确的,因为它解析了那个。它只是不会抓住 AdditiveExpression.

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

看起来 syntax 只是忽略了 --parse 模式下有语法错误的操作。如果您实际上使用 --output 将语法编译为 JavaScript,当您尝试使用节点 运行 生成的文件时,您将得到一个实际的语法错误,告诉您错误在哪里。