Algorithm 如何跟踪迭代(非递归)函数上的嵌套信息
假设我有一个定义了一堆嵌套规则的Algorithm 如何跟踪迭代(非递归)函数上的嵌套信息,algorithm,parsing,recursion,data-structures,stack,Algorithm,Parsing,Recursion,Data Structures,Stack,假设我有一个定义了一堆嵌套规则的 Expr ← Sum Sum ← Product (('+' / '-') Product)* Product ← Value (('*' / '/') Value)* Value ← [0-9]+ / '(' Expr ')' 说我是对的● 这里是过程中的第二个值: Expr ← Sum Sum ← Product (('+' / '-') Product)* Product ← Value (('*' / '/') ●)*
Expr ← Sum
Sum ← Product (('+' / '-') Product)*
Product ← Value (('*' / '/') Value)*
Value ← [0-9]+ / '(' Expr ')'
说我是对的● 这里是过程中的第二个值
:
Expr ← Sum
Sum ← Product (('+' / '-') Product)*
Product ← Value (('*' / '/') ●)*
Value ← [0-9]+ / '(' Expr ')'
这意味着我在这里的某个地方处于嵌套级别,比如说:
Expr
Sum
|Product
+
Product
|Product
-
Product
|Value
*
Value
|Value
*
●
当使用递归下降进行解析时,它是递归的,因此当值
返回时,我们返回到“序列”*
解析节点,然后返回到产品
节点,该节点返回到产品序列节点,等等。因此很容易建立解析树
但是假设你想用一个。问题是,如何跟踪嵌套信息,以便在代码中(最终)说:
棘手的是,这可以任意嵌套,因此您可能有:
Product
Value
Product
Value
Product
...
因此,如果像handleProductSequence
这样的函数除了函数的参数之外没有任何上下文,我无法告诉它应该如何“包装”并最终创建ProductSequence
对象。在我添加的state
对象中,我正在尝试添加state.stack
属性或其他内容的方法,但我不确定其中会包含什么。任何帮助都将不胜感激。您的堆栈必须在控制流中包含“您所在的位置”。在递归下降解析器中,这实际上与您在解析中的位置相同,因此您可以以这种方式编写通用LL解析器。就我个人而言,我可能会将一个产品表示为一个带有标记列表和处理函数的对象。(再加上一些EBNF操作符的扩展,如*
)一个状态将是一个生产、生产中的一个位置和一个已匹配值的列表
但是,当LR解析器生成器已经存在,基本上使用这种表示,并且它们可以处理更多的语法时,很难找到这样做的好理由
Product
Value
Product
Value
Product
...