gpt4 book ai didi

algorithm - 如何跟踪迭代(非递归)函数的嵌套信息

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:10:00 25 4
gpt4 key购买 nike

假设我有一个 recursive descent parser定义了一堆嵌套规则。

Expr    ← Sum
Sum ← Product (('+' / '-') Product)*
Product ← Value (('*' / '/') Value)*
Value ← [0-9]+ / '(' Expr ')'

说我是对的 ● 这里是过程中的第二个 Value:

Expr    ← Sum
Sum ← Product (('+' / '-') Product)*
Product ← Value (('*' / '/') ●)*
Value ← [0-9]+ / '(' Expr ')'

这意味着我在嵌套层级中的某处,比方说:

Expr
Sum
|Product
+
Product
|Product
-
Product
|Value
*
Value
|Value
*

当使用递归下降解析时,它是递归的,所以当 Value 返回时,我们回到“sequence” * 解析节点,然后返回到 Product节点,返回product序列节点等。所以很容易构建解析树。

但假设您想使用 iterative stack 来执行此操作.问题是,如何跟踪嵌套信息以便您可以在代码中说(最终):

function handleValue(state, string) {
// ...
}

function handleValueSequence(state, string) {
if (state.startedValueSequenceEarlier) {
wrapItUp(new ValueSequence(state.values))
}
}

function handleProduct(state, string) {
// ...
}

function handleProductSequence(state, string) {
if (state.startedProductSequenceEarlier) {
wrapItUp(new ProductSequence(state.products))
}
}

棘手的部分是,它可以任意嵌套,所以你可能有:

Product
Value
Product
Value
Product
...

因此,如果像 handleProductSequence 这样的函数除了函数的参数之外没有任何上下文,我不知道它应该如何“wrapItUp”并最终创建那个 ProductSequence 对象。在我添加的那个 state 对象中,我试图想办法添加一个 state.stack 属性或其他东西,但我不确定那里会有什么。任何帮助将不胜感激。

最佳答案

您的堆栈必须在控制流中包含“您所在的位置”。在递归下降解析器中,这实际上与您在解析中的位置相同,因此您可以以这种方式编写通用的 LL 解析器。就我个人而言,我可能会将产生式表示为具有 token 列表和处理程序函数的对象。 (再加上 EBNF 运算符的一些扩展,例如 *。)然后,状态将是产生式、产生式中的位置以及已匹配值的列表。

但是当 LR 解析器生成器已经存在时,很难找到这样做的充分理由,基本上使用这种表示,并且它们可以处理更多的语法。

关于algorithm - 如何跟踪迭代(非递归)函数的嵌套信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50971621/

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