首先:使用 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 解析器的正确语法中,任何模拟代码仍然会有帮助!
最佳答案
正如这些事情经常发生的那样,在拼命询问后不久,答案就会在你吃三明治时出现。 TL;DR:这样解决:
expMemberExpression.Production =
(
expPrimaryExpression
|stFunctionExpression
| (@NewKeyword + expMemberExpression + expArguments)
) + expMemberExpressionHelper.ZeroOrMore();
expMemberExpressionHelper.Production = (symLiteralOpenSquare + expExpression + symLiteralCloseSquare)
| ( @punctuator + symIdentifier );
关于JavaScript (ECMA) 语法 - 左递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830825/