问题描述
我只是在学习lex / bison / yacc等,并且正在通过名为syntax的库进行运行
这是通过有关UDemy的教程完成的。
我才刚刚开始并尝试使其使其为2 + 2
生成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,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
。
解决方法
您在某些对象文字中缺少逗号(特别是在type: BinaryExpression
出现两次之后)。
在syntax
模式下,--parse
似乎完全忽略了具有语法错误的操作。如果您实际上使用--output
将语法编译为JavaScript,那么当您尝试使用node运行生成的文件时,会收到一个实际的语法错误,告诉您错误在哪里。