LL(1)具有语法的解析表

时间:2015-11-10 10:41:20

标签: parsing context-free-grammar

我试图获得LL(1)解析表,语法如下,

S -> ( L ) | a
L -> L , S | S

我认为它有间接的左递归,因为这个,

L -> S

所以我把它改成了,

S -> ( L ) | a
L -> L , ( L ) | L , a | ( L ) | a

然后像这样,

S -> ( L ) | a
L -> ( L ) L' | aL'
L' -> , ( L ) L' | ,aL' | epsilon

有了这个,我得到FIRSTs和FOLLOWs

FIRST(S) = { (, a }          FOLLOW(S) = { $ }
FIRST(L) = { (, a }          FOLLOW(L) = { ) }
FIRST(L') = { , , epsilon}   FOLLOW(L') = { ) }

但是当我绘制LL解析表时,它并没有转到$。

我犯了错误或误会吗?

1 个答案:

答案 0 :(得分:1)

(我的解析理论很生疏,所以我可能在这里犯了一些错误。)

L -> S是间接递归的一部分,但不是左递归。制作只能“扩展”为L ->+ ( L )L ->+ a,两者都以终端开头。这里唯一的左递归是在生产L -> L , S中。在removing this direct left recursion之后,我最终得到以下语法:

S -> ( L ) | a
L -> S L'
L' -> , S L' | ε

这样,您计算的FIRSTFOLLOW集合是相同的,但FOLLOW(S)不完整。除了$(因为S是开始状态),FOLLOW(S)必须包含FIRST(L')的所有元素(因为L -> S L'L' -> , S L')和{ {1}}(因为FOLLOW(L'))。我得到L' -> ε

我得到的解析表如下:

FOLLOW(S) = { $, ,, ), ε }

我不确定你的意思是“它没有去 | ( | a | , | ) | $ | ----+--------+--------+----------+-----+-----+ S | L ) | a | | | | L | S L' | S L' | | | | L' | | | , S L' | ε | | ”。我可以说的是,$列是空的,因为$的所有产品都是非空的并以终端结束。