LL(1) parse table 中 $ 列下的条目是否必要?
Is entry under $ column in LL(1) parse table necessary?
对于一种编程语言的 LL(1) 语法,是否有必要在 $ in parse table 列下至少获取一个条目。
如果是,我们可以在语法中查找哪些可能的错误。
$
(输入结束)列可能为空。发生这种情况的一个 class 语法是 S
的所有产生式都是非空的并以终端结尾。
让我们以S -> ( S* )
为例,或者更明确地说:
S -> ( T )
T -> S T
T -> ε
我们可以为这个语法构建以下 LL(1) 解析 table:
| ( | ) | $ |
---+---------+-----+-----+
S | ( T ) | | |
T | S T | ε | |
请记住,LL 解析器堆栈包含终结符和非终结符。如果输入和堆栈以相同的终端开始,它们都会被删除。输入结尾(通常表示为特殊终端)也是如此:当且仅当我们到达输入结尾并且我们的解析器堆栈为空时,解析才成功完成。
我能想到的 $
列唯一合理的条目是 ε
。毕竟,如果堆栈上有任何(非空)终端,就不可能解析空字符串。当 $
列包含某个终端的 ε
时,这意味着您可以在到达输入末尾时将其从堆栈中删除。在我们的示例中,我们没有理由允许这样做。
对于一种编程语言的 LL(1) 语法,是否有必要在 $ in parse table 列下至少获取一个条目。
如果是,我们可以在语法中查找哪些可能的错误。
$
(输入结束)列可能为空。发生这种情况的一个 class 语法是 S
的所有产生式都是非空的并以终端结尾。
让我们以S -> ( S* )
为例,或者更明确地说:
S -> ( T )
T -> S T
T -> ε
我们可以为这个语法构建以下 LL(1) 解析 table:
| ( | ) | $ |
---+---------+-----+-----+
S | ( T ) | | |
T | S T | ε | |
请记住,LL 解析器堆栈包含终结符和非终结符。如果输入和堆栈以相同的终端开始,它们都会被删除。输入结尾(通常表示为特殊终端)也是如此:当且仅当我们到达输入结尾并且我们的解析器堆栈为空时,解析才成功完成。
我能想到的 $
列唯一合理的条目是 ε
。毕竟,如果堆栈上有任何(非空)终端,就不可能解析空字符串。当 $
列包含某个终端的 ε
时,这意味着您可以在到达输入末尾时将其从堆栈中删除。在我们的示例中,我们没有理由允许这样做。