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,当您尝试使用节点 运行 生成的文件时,您将得到一个实际的语法错误,告诉您错误在哪里。
我正在学习 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,当您尝试使用节点 运行 生成的文件时,您将得到一个实际的语法错误,告诉您错误在哪里。