我试图在 Treesitter 语法中使运算符优先级正确。Treesitter 是一个 LR1 解析器生成器。
我有一个简单的算术语法,部分看起来像这样:
multiply_expression: $ => prec.left(2, seq(
$._expression,
'*',
$._expression,
)),
addition_expression: $ => prec.left(1, seq(
$._expression,
'+',
$._expression,
)),
这可以正常工作。multiply_expression
确实比addition_expression
.
但是,当我添加中间规则时,优先级会发生变化:
_partial_multi: $ => seq(
$._expression,
'*',
),
multiply_expression: $ => prec.left(2, seq(
$._partial_multi,
$._expression,
)),
我转向$.expression, '*'
了它自己的规则。对我来说,这似乎是一个等效的语法,我预计不会有任何变化。但是,随着这种变化,优先级不再正确。addition_expression
,保持不变,似乎比 具有更高的优先级multiply_expression
。
为什么引入额外的步骤会改变优先级?是否有此问题的名称,或者我在哪里可以找到有关它的更多信息?在编写语法或修复优先级问题时,是否有要遵循的规则或思考方式?