Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript(ECMA)语法-左递归问题_Javascript_C_Grammar - Fatal编程技术网

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

JavaScript(ECMA)语法-左递归问题,javascript,c,grammar,Javascript,C,Grammar,首先:使用Actipro语法编辑器中的LL(*)解析器。不过,这可以应用于任何LL(k)解析器 我目前正在尝试为Javascript编写一个有效的LL(k)语法(使用ECMA-262引用),有时弄清楚左递归是可以的,但我一直在为这个问题寻找解决方案。(自从我连续三天不停地做这件事以来,我可能已经失去了注意力) 好的,解决方案示例: 以这条规则为例: BitwiseORExpression : BitwiseXORExpression BitwiseORExpression | B

首先:使用Actipro语法编辑器中的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;博士:这样解决:

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

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

完成了,完成了,虽然它告诉我需要等两天才能接受我自己的答案。我想这是因为我刚刚创建了这个帐户。谢谢!我认为,在问题上,给别人一个机会给出其他/更好的答案是很正常的,而你最终可能更喜欢自己的解决方案。23这个标签是什么意思?