【发布时间】:2014-09-15 00:40:45
【问题描述】:
我正在尝试编写一个 PEGjs 规则来转换
Return _a_b_c_.
到
Return <>a_b_c</>.
我的语法是
root = atoms:atom+
{ return atoms.join(''); }
atom = variable
/ normalText
variable = "_" first:variableSegment rest:$("_" variableSegment)* "_"
{ return '<>' + first + rest + '</>'; }
variableSegment = $[^\n_ ]+
normalText = $[^\n]
这适用于
Return _a_b_c_ .
和
Return _a_b_c_
但是出现了问题
Return _a_b_c_.
例子。
我不太明白为什么会出现这种情况,并且希望能解释一下它为什么会这样。 (我什至不需要解决这个问题,当然;最大的问题是我对 PEGjs 语法的心智模型有缺陷。)
【问题讨论】:
-
_.匹配"_" variableSegment部分,但缺少尾随"_",这就是使用normalText规则的原因。 (Return _a_b_c_.与Return _a_b_c_d相同) -
为什么在这样解释时看不到规则不匹配,而是将最后一个 _ 解释为尾随 _?
-
当它在
.之后没有看到尾随_时失败,它会通过假设前导_a是“正常”来回溯。我不确定我知道为什么。 -
哦 - 如果您不希望尾随
_
标签: javascript parsing grammar pegjs