Parsing 建筑物LR(1)配置前瞻

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 .

在构建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中。

谢谢

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的子集?再次感谢。