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