Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 自底向上解析器:何时应用哪种缩减规则?_Parsing_Context Free Grammar_Bottom Up - Fatal编程技术网

Parsing 自底向上解析器:何时应用哪种缩减规则?

Parsing 自底向上解析器:何时应用哪种缩减规则?,parsing,context-free-grammar,bottom-up,Parsing,Context Free Grammar,Bottom Up,让我们看一下以下上下文无关语法: G = ( {Sum, Product, Number}, {decimal representations of numbers, +, *}, P, Sum) 作为p: Sum → Sum + Product Sum → Product Product → Product * Number Product → Number Number → decimal representation of a number 我试图用一个自底向上的解析器和一个长度为1的

让我们看一下以下上下文无关语法:

G = ( {Sum, Product, Number}, {decimal representations of numbers, +, *}, P, Sum)
作为p:

Sum → Sum + Product
Sum → Product
Product → Product * Number
Product → Number
Number → decimal representation of a number
我试图用一个自底向上的解析器和一个长度为1的前瞻缓冲区(LAB)来解析由该语法生成的表达式(假设不需要猜测和回溯)

现在,给定一个堆栈和一个实验室,通常有几种可能的方法来减少堆栈,或者是完全减少堆栈还是推送另一个令牌

目前我使用此决策树:

如果堆栈的任何前n个令牌加上LAB是 在规则的右侧,我将下一个令牌推到堆栈上

否则,我将减少堆栈顶部令牌的最大数量。 即,如果有可能同时减少最上面的项目 有可能减少前三项,我做后一项

如果没有这样的减少是可能的,我将另一个令牌推到堆栈上

冲洗并重复

这似乎(!)是可行的,但是它需要大量的规则搜索、查找匹配的前缀等。这不可能在O(NM)中运行

决定是减少还是推动(移位)的标准(可能也是唯一合理的)方法是什么?如果减少,应用哪种减少?


提前感谢您的评论和回答。

对于像您这样的语法(基本上是表达式语法),最简单的自底向上解析方法是运算符优先解析

回想一下,自底向上解析涉及从底部从左到右构建解析树。换句话说,在解析过程中的任何给定时间,我们都有一个部分组装的树,在我们读取的位置的右侧只有终端符号,在左侧是终端和非终端的组合(“前缀”)。唯一可能的缩减是适用于前缀后缀的缩减;如果没有减少应用,我们必须能够将一个终端从输入移动到前缀

运算符语法的特点是,在任何生产中都不存在两个连续的非终结符。因此,在运算符语法的自底向上解析中,前缀中的最后一个符号是终端,或者最后第二个符号是终端。(他们两个都可能是。)

运算符优先解析器基本上对非终端是盲的;这根本无法区分它们。因此,不能有两个右端包含完全相同的终端序列的产品,因为op-prec解析器不知道应用这两个产品中的哪一个。(这是传统的观点。实际上可以稍微扩展一下,这样就可以有两个具有相同终端的产品,前提是非终端位于不同的位置。这允许使用一元
-
运算符的语法,例如,因为可以区分右侧的
-
-
)他们不知道非终端的名称,只知道它们的存在

另一个要求是,您必须能够在终端之间建立优先关系。更准确地说,我们定义了三种优先关系,通常写为
·=·
(或主题的一些印刷变体),并坚持对于任何两个终端
x
y
,最多一个关系
x·>y
x·=·y
x y
,然后我们减少并重复该规则。否则,我们将
y
移到前缀上


为了减少,我们需要找到生产的开始。我们向后移动前缀,比较连续的终端(所有终端都必须有
谢谢rici)。让我消化一下你的答案。这种方法是否也适用于这个问题的语法:?我恐怕不是因为
TupleItem→ TupleItem TupleItem
…@Hyperboreus:我用运算符语法回答了你的另一个问题。Op prec解析实际上可以直接处理正则表达式RHS,并且可以为元组语法构建一个非常简单的Op prec解析器。Muchísimas gracias,carnal。在我的问题中给出的语法中,哪种关系(
)端子
十进制
+
之间,以及
+
十进制
之间是否存在?如果我读得正确,则根本没有。