gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:15 25 4
gpt4 key购买 nike

首先:使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com