JavaScript(ECMA)语法 - 左递归问题

时间:2013-02-12 10:52:31

标签: javascript c grammar

首先:使用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的正确语法,任何模拟代码仍然有用!

1 个答案:

答案 0 :(得分:2)

正如经常这些事情一样,在拼命询问之后不久,吃三明治时会得到答案。 TL; DR:像这样解决:

expMemberExpression.Production = 
            (
            expPrimaryExpression
            |stFunctionExpression
            | (@NewKeyword + expMemberExpression + expArguments)
            ) + expMemberExpressionHelper.ZeroOrMore();

expMemberExpressionHelper.Production = (symLiteralOpenSquare + expExpression + symLiteralCloseSquare)
            | ( @punctuator + symIdentifier );