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

标签 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 解析器的正确语法中,任何模拟代码仍然会有帮助!

最佳答案

正如这些事情经常发生的那样,在拼命询问后不久,答案就会在你吃三明治时出现。 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/

相关文章:

javascript - 使用 D3.js (v4) 制作折线图动画?

c - make 出了什么问题?

c - sdl_gl_setattribute 上的 sdl 应用程序段错误

java - JAVA中的"threadsafe"修饰符?

rust - Rust 的句法语法是上下文无关的还是上下文敏感的?

javascript - jQuery UI Tabs 在选项卡中加载特定链接

Javascript 添加的表单元素无法通过 $_POST 获得

c - C语言使用队列的BFS遍历程序

Python PLY解析: definition scope

javascript - Yii ajax 验证不显示错误消息