LL(1) parse table 中 $ 列下的条目是否必要?

Is entry under $ column in LL(1) parse table necessary?

对于一种编程语言的 LL(1) 语法,是否有必要在 $ in parse table 列下至少获取一个条目。

如果是,我们可以在语法中查找哪些可能的错误。

$(输入结束)列可能为空。发生这种情况的一个 class 语法是 S 的所有产生式都是非空的并以终端结尾。

让我们以S -> ( S* )为例,或者更明确地说:

  1. S -> ( T )
  2. T -> S T
  3. T -> ε

我们可以为这个语法构建以下 LL(1) 解析 table:

   |  (      |  )  |  $  |
---+---------+-----+-----+
S  |  ( T )  |     |     |
T  |  S T    |  ε  |     |

请记住,LL 解析器堆栈包含终结符和非终结符。如果输入和堆栈以相同的终端开始,它们都会被删除。输入结尾(通常表示为特殊终端)也是如此:当且仅当我们到达输入结尾并且我们的解析器堆栈为空时,解析才成功完成。

我能想到的 $ 列唯一合理的条目是 ε。毕竟,如果堆栈上有任何(非空)终端,就不可能解析空字符串。当 $ 列包含某个终端的 ε 时,这意味着您可以在到达输入末尾时将其从堆栈中删除。在我们的示例中,我们没有理由允许这样做。