Parsing 建筑物LR(1)配置前瞻
在构建LR(1)项目集时,我确实有一些困难来计算前瞻性,我尝试了一些来自不同站点的课堂讲稿,但仍然。。。 我的例子是 S -> E + S | E E -> num | ( S ) S->E+S|E E->num |(S) 项目集为 I0: S’ -> . S $ S -> . E + S $ S -> . E $ E -> . num +,$ E -> . ( S ) +,$ I1: S ->E .+ S $ S ->E . $ I0: S'->。$ S->。E+S$ S->。E$ E->。num+$ E->。(S)+$ I1: S->E.+S$ S->E$ 集合I0中的第一项 S’ -> . S $ S'->。$ 是初始化 集合I0中的第二项 S -> . E + S $ S -> . E $ S->。E+S$ 表示堆栈上没有任何内容,我们希望读取E+S,然后在E+S为$后减少iff令牌 集合I0中的第三项 S -> . E + S $ S -> . E $ S->。E$ 这意味着我们希望在E为$后读取E并减少iff令牌 然后我对集合I0中的第四项感到困惑 E -> . num +,$ E->。num+$ 我不知道为什么会有+和$代币 如果有人能用简单的英语给我解释一下。 对于I中的每个配置[A–>u•Bv,A],对于G'中的每个生产B–>w,以及 第一个(va)中的每个端子b使得[b–>•w,b]不在I中:将[b–>•w,b]添加到I中。 谢谢Parsing 建筑物LR(1)配置前瞻,parsing,compiler-construction,Parsing,Compiler Construction,在构建LR(1)项目集时,我确实有一些困难来计算前瞻性,我尝试了一些来自不同站点的课堂讲稿,但仍然。。。 我的例子是 S -> E + S | E E -> num | ( S ) S->E+S|E E->num |(S) 项目集为 I0: S’ -> . S $ S -> . E + S $ S -> . E $ E -> . num +,$ E -> . ( S ) +,$ I1: S ->E .+ S $ S ->E .
E -> . num +,$
E -> . ( S ) +,$
+,$表示只有这些标记可以跟在数字或右括号后面。想想看:语法不允许相邻的num或(),它们必须在句子的末尾或后面跟一个+
至于转换请求,它是一种奇特的方式,用来表示如何计算可以跟随给定令牌的令牌集。上面的+、$就是一个例子。它们是唯一可以跟在num和后面的合法代币。我想我找到了答案。
我使用的是
for set I0:
Begin with [S' -> .S, $]
Match [A -> α.Bβ, a]
Then add in [B -> .γ, b]
Where terminal b is FIRST(βa)
for set I1...In
Compute GOTO(I0,X)
Add in X productions and LOOKAHEAD token
对于集合I0:
以[S'->.S,$]开头
匹配[A->α.Bβ,A]
然后加入[B->.γ,B]
其中端子b是第一个(βa)
对于集合I1…中的
计算转到(I0,X)
外接程序X产品和前瞻令牌
在这个例子中
S -> E + S
S -> E
E -> num
E -> ( S )
S->E+S
S->E
E->num
E->(S)
首先,
S’ -> . S $
S'->。$
我们尝试将它与[A->α.Bβ,A]匹配,即
A=S',α=ε,B=S,β=ε,A=和
第一(βa)={$}
添加[B->.γ,B],它们是
S -> . E + S $ ...1
S -> . E $ ...2
S->。E+S$…1
S->。E$…2
在I0中
然后,我们需要为E添加productions作为1和2。
在这种情况下,我们的[A->α.Bβ,A]是1和2。
因此,首先(βa)={+,$},我们有
E -> . num +,$
E -> . ( S ) +,$
E->。num+$
E->。(S)+$
现在,我们计算GOTO(I0,X)
对于X=E
我们将dot移动一个位置,发现不需要添加任何产品。所以我们只需从中添加第二个组件$
S -> . E + S $
S -> . E $
S->。E+S$
S->。E$
这给了我们I1
S ->E .+ S $
S ->E . $
S->E.+S$
S->E$
等等
那么,在构建LR(1)项集时,这是正确且有效的方法吗?谢谢Rachard,您的意思是,对于项E->.num+,$和项E->.(S)+,$来说,先行标记实际上是跟随(E)的。如果是,那么为什么I1中的项目集只是FOLLOW的子集?再次感谢。