2

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

4

1 回答 1

2

由于这些事情经常发生,在拼命询问后不久,答案就会在你吃三明治的时候出现。TL; DR:像这样解决:

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

expMemberExpressionHelper.Production = (symLiteralOpenSquare + expExpression + symLiteralCloseSquare)
            | ( @punctuator + symIdentifier );
于 2013-02-12T12:01:45.580 回答