所以我正在为考试研究编译器构造,但是似乎有些我不理解的东西。
让我们假设以下终端集:
T = {:, *, =, (, ), <, >, {, }, [a..z], [0..9]}
可接受的令牌集(l
指向字母,d
指向数字):
A = { l(l|d)* , (d)+ , { (anything)* } , : , := , < , <= , <> , > , >= , ( , (* , * , *) }
这是状态转换图:
现在,我知道州号 20 需要回溯,因为:
(
,但是后面可能会有*
。:
,但是后面可能会有=
。<
,但后面可能跟着=
或>
。>
,但是后面可能会有=
。但是状态 3 , 5 和 11 呢? ,为什么我们需要回溯它们?。
答案 0 :(得分:2)
这里看起来像“回溯”,意味着您已经读过一个字符,但尚未使用它。因此,对于状态3,我们消耗了l
以及一些l
和d
,然后我们得到了一些都不是的字符;该字符终止了l(l|d)*
规则,但仍然需要处理。
将其与状态7进行对比,在状态7中我们读取了}
字符以终止规则,并且我们用尽了}
,因此我们不需要“回溯”。
这种解释与状态3、5和20一致,但是我不明白为什么11需要回溯。