2

我正在尝试学习编译器构造,我刚刚通读了关于 SLR 解析器的 Dragon Book 章节。因此,我决定制作一个简单的语法并尝试手动编写解析器代码。语法如下所示:

S -> A
A -> (A)A
A -> e,

哪里e是空字符串产生。

根据 StackOverflow 上的另一个问题,处于起始状态的项目应如下所示

S -> .A
A -> .(A)A
A -> .e,

但是 GOTO 函数会是什么样子。我知道这一点GOTO( '(' ) = *some state with A -> (.A)A*,但我无法真正理解GOTO(e)。解析器看到一个空字符串并没有什么意义。可以?

谢谢大家!

迈克尔

4

1 回答 1

0

不,解析器看不到空字符串。它看到的是传入的符号(下一个令牌)。如果传入的符号没有导致 goto 操作(进入新状态),则解析器被迫进行归约 (A -> e),然后基于 A 执行 goto(非终结转换)。

In State:   

A -> '(' . A ')' A
A -> . '(' A ')' A 
A -> e

if the input symbol is not '(', then the parser will make the reduction:

A -> e

and go to the new state:

A -> '('  A . ')' A
于 2013-07-09T20:00:02.143 回答