繁体   English   中英

LL(1) 语法解析表

[英]LL(1) Parsing table with 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解析表时,它不会转到$。

我有没有弄错或误解?

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

L -> S是间接递归的一部分,但不是左递归。 产生式只能“扩展”为L ->+ ( L )L ->+ a ,两者都以终端开头。 这里唯一的左递归是在产生式L -> L , S 删除这个直接左递归后,我最终得到以下语法:

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

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

我得到的解析表如下:

    |  (     |  a     |  ,       |  )  |  $  |
----+--------+--------+----------+-----+-----+
S   |  L )   |  a     |          |     |     |
L   |  S L'  |  S L'  |          |     |     |
L'  |        |        |  , S L'  |  ε  |     |

我不确定你所说的“它不会去$ ”是什么意思。 我只能说$列是空的,因为S所有产生式都是非空的并且以终端结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM