首先:使用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的正确语法,任何模拟代码仍然有用!
答案 0 :(得分:2)
正如经常这些事情一样,在拼命询问之后不久,吃三明治时会得到答案。 TL; DR:像这样解决:
expMemberExpression.Production =
(
expPrimaryExpression
|stFunctionExpression
| (@NewKeyword + expMemberExpression + expArguments)
) + expMemberExpressionHelper.ZeroOrMore();
expMemberExpressionHelper.Production = (symLiteralOpenSquare + expExpression + symLiteralCloseSquare)
| ( @punctuator + symIdentifier );