以下为一LL文法,
program -> stmt_list $$
stmt_list -> stmt stmt_list
stmt_list -> 空串
stmt -> id := expr
stmt -> read id
stmt -> write expr
expr -> term term_tail
term_tail -> add_op term term_tail
term_tail -> 空串
term -> factor factor_tail
factor_tail -> mult_op factor factor_tail
factor_tail -> 空串
factor -> ( expr )
factor -> id
factor -> number
add_op -> +
add_op -> -
mult_op -> *
mult_op -> /
========
first集
========
program {id ,read, write, $$}
stmt_list {id, read, write, 空串}
stmt {id, read, write}
expr {(, id, number}
term_tail { +, - , 空串}
term {(, id, number}
factor_tail {*, / , 空串}
factor {(, id, number}
add_op {+, -}
mult_op {*, /}
=========
follow集
=========
id {+,-,*,/,),:=,id,read,write,$$}
number {+,-,*,/,),id,read,write,$$}
read {id}
write {(,id,number}
( {(,id,number}
) {+,-,*,/,),id,read,write,$$}
:= {(,id,number}
+ {(,id,number}
- {(,id,number}
* {(,id,number}
/ {(,id,number}
$$ {空串}
program {空串}
stmt_list {$$}
stmt {id, read, write, $$}
expr {),id,read,write, $$}
term_tail {),id,read,write, $$}
term {+,-,),id,read,write,$$}
factor_tail {+,-,),id,read,write,$$}
factor {+,-,*,/,),id,read,write,$$}
add_op {(,id,number}
mult_op {(,id,number}
1、对于"first集",我认为如下:
1)如果是非终结符,如stmt,则first(stmt)为其右边产生式的第一个终结符的
集合,即如下:
first(stmt) = {id,read,write}
2) 如果是终结符,如id,则first(id)为该终结符本身,即first(id) = id
3)如果为空串,则为空串本身,即 first(空串) = 空串
问题:
1)我的理解对吗?
2)对于 first(program)所得的集合中 $$ 是怎么得来的?不明白...
2、对于“follow集”
问题:
1)对于follow集,我是不太明白。请以 follow(id)为例讲解一下,谢谢。 |