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