下面是我用于计算机语言的语法,以及我尝试查找跟随集和第一组语法的语法。
我想帮助弄清楚我在弄清楚我做错了什么,因为我觉得我根本没有正确地做到这些(至少对于以下几组)
语法
program→stmt_list $$$
stmt_list→stmt stmt_list | ε
stmt→id = expr |输入id | print expr
expr→term term_tail
term_tail→添加术语term_tail | ε
term→factor fact_tail
fact_tail→mult_op fact fact_tail | ε
factor→(expr)|号码| ID
add_op→+ | -
mult_op→* | / | // | %
首先设置
first(p)= {id,input,print}
first(stmt_list)= {id,input,print,e}
first(s)= {id,input,print}
first(expr)= {(,id,number}
first(term_tail)= {+, - ,e}
first(term)= {(,id,number}
first(fact_tail)= {,/,//,%,e}
first(factor)= {(,id,number}
first(add_op)= {+, - }
first(mult_op)= {,/,//,%}
按照设置
关注(p)= {$}
关注(stmt_list)= {$}
follow(stmt)= {id,input,print}
follow(expr)= {(,id,number,),input,print,,/,//,%}
follow(term_tail)= {),(,id,number,print,input}
跟随(term)= {+, - }
follow(factor)= {,/,//,%}
关注(add_op)= {} follow(mult_op)= {}
follow(fact_tail)= {*,/,//,%,+, - }
答案 0 :(得分:2)
你在First中也有一些错误
first(p)= {id,input,print,e}
它将包括epsilon *在接下来的两个中缺失 -
first(fact_tail) = { *,/, //, %, e} first(mult_op) = {*, /, //, %}
fact_tail→mult_op fact fact_tail | ε
Iam在这里假设你实际上意味着
fact_tail→mult_op factor fact_tail | ε
<强>按照强>
关注(stmt)= {id,input,print,$}
如果您参考
stmt_list→stmt stmt_list | ε
然后stmt之后是stmt_list中的第一个,其中包含e,因此生成的字符串将结束,因此stmt后跟$
follow(expr)= {(,id,number,),input,print ,, /,//,%}
我不知道你是怎么得到的,跟随expr等于遵循stmt和)
follow(expr)= {id,),input,print,$}
follow(term_tail)等于follow(expr)
关注(term)= {+, - ,),id,input,print,$}
follow(fact_tail)等于follow(term)
follow(factor)= first(fact_tail)
follow(add_op)= first(term)
follow(mult_op)= first(factor)
如果您不同意,请讨论而不是downvoting。我希望这可以帮助你