首先:使用 Actipro SyntaxEditor 中的 LL(*) 解析器。不过,这可能适用于任何 LL(k) 解析器。
我目前正在尝试为 Javascript 编写一个有效的 LL(k) 语法(使用 ECMA-262 参考),有时弄清楚左递归是可以的,但我一直在努力寻找解决这个问题的方法。(并且可能已经失去了注意力,因为我已经连续三天不停地工作了)
好的,解决方案示例:
采取这条规则:
BitwiseORExpression :
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
这实际上会变成:
expBitwiseOR.Production = expBitwiseXOR | expBitwiseOR + @bitwiseOrSign + expBitwiseXOR;
并避免左递归:
expBitwiseOR.Production = expBitwiseXOR + ( @bitwiseOrSign + expBitwiseXOR ).ZeroOrMore();
很简单。然而,我坚持使用更复杂的规则,例如:
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
我已经尝试了几件事,其中一些工作(即它们“工作”但不是他们应该做的)和大多数不工作(即左递归)。老实说,我并不希望得到完整的答案或完整的解决方案,但也许有人会知道如何使用复杂的规则或其他规则来避免这个问题。
也无需将其放入 Actipro Parser 的正确语法中,任何模型代码仍然会有所帮助!