编译器构造-为什么某些令牌需要带有回溯的最终状态?

时间:2019-01-22 22:22:25

标签: compiler-construction lexical-analysis dfa

所以我正在为考试研究编译器构造,但是似乎有些我不理解的东西。

让我们假设以下终端集:

T = {:, *, =, (, ), <, >, {, }, [a..z], [0..9]}

可接受的令牌集(l指向字母,d指向数字):

A = { l(l|d)* , (d)+ , { (anything)* } , : , := , < , <= , <> , > , >= , ( , (* , * , *) } 

这是状态转换图:

State transition diargram

现在,我知道州号 20 需要回溯,因为:

  • 可能会出现(,但是后面可能会有*
  • 可能会出现:,但是后面可能会有=
  • 可能会出现<,但后面可能跟着=>
  • 可能会出现>,但是后面可能会有=

但是状态 3 5 11 呢? ,为什么我们需要回溯它们?。

1 个答案:

答案 0 :(得分:2)

这里看起来像“回溯”,意味着您已经读过一个字符,但尚未使用它。因此,对于状态3,我们消耗了l以及一些ld,然后我们得到了一些都不是的字符;该字符终止了l(l|d)*规则,但仍然需要处理。

将其与状态7进行对比,在状态7中我们读取了}字符以终止规则,并且我们用尽了},因此我们不需要“回溯”。

这种解释与状态3、5和20一致,但是我不明白为什么11需要回溯。