【发布时间】: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。
【问题讨论】: