【发布时间】:2018-11-30 23:14:35
【问题描述】:
假设我有一个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返回时,我们回到“序列”*解析节点,然后返回到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 属性或其他东西的方法,但我不确定那里会发生什么。任何帮助将不胜感激。
【问题讨论】:
标签: algorithm parsing recursion data-structures stack