【问题标题】:Lex / bison won't generate an ast 2 + 2Lex / bison 不会生成 ast 2 + 2
【发布时间】:2020-11-12 11:45:06
【问题描述】:

我只是在学习 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,里面有numericLiterals。

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

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

【问题讨论】:

    标签: bison lex


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多