Parsing 先计算后计算语法集

Parsing 先计算后计算语法集,parsing,compiler-construction,grammar,context-free-grammar,Parsing,Compiler Construction,Grammar,Context Free Grammar,下面是我在计算器语言中使用的语法,以及我在查找跟随集和第一组语法时的尝试 当我试图找出这些集合时,我很想知道我做错了什么,因为我觉得我根本没有做对(至少对于下面的集合) 文法 节目→ stmt\U列表$$$ stmt_列表→ stmt stmt|u列表ε stmt→ id=expr |输入id |打印expr expr→ 术语尾部 术语尾→ 添加op术语|ε 学期→ 因子事实尾部 事实真相→ 多个事实尾部ε 因素→ (expr)|编号| id 加上→ + | - 木偶→ * | / | // |

下面是我在计算器语言中使用的语法,以及我在查找跟随集和第一组语法时的尝试

当我试图找出这些集合时,我很想知道我做错了什么,因为我觉得我根本没有做对(至少对于下面的集合)

文法

节目→ stmt\U列表$$$
stmt_列表→ stmt stmt|u列表ε
stmt→ id=expr |输入id |打印expr
expr→ 术语尾部
术语尾→ 添加op术语|ε
学期→ 因子事实尾部
事实真相→ 多个事实尾部ε
因素→ (expr)|编号| id
加上→ + | -
木偶→ * | / | // | %

第一盘

第一(p)={id,输入,打印}
第一(stmt_列表)={id,输入,打印,e}
第一个(s)={id,输入,打印}
第一(expr)={(,id,number}
第一(项尾)={+,-,e}
第一(项)={(,id,number}
第一(事实尾)={,/,/,%,e}
第一(因子)={(,id,number}
第一个(加法运算)={+,-}
第一(mult_op)={,/,/,%}

跟随组

跟随(p)={$}
follow(stmt_list)={$}
follow(stmt)={id,input,print}
follow(expr)={(,id,number,),输入,打印,/,/,%}
follow(term_tail)={),(,id,number,print,input}
跟随(项)={+,-}
跟随(因子)={,/,/,%}
follow(add_op)={} follow(mult_op)={}
跟随(事实尾)={*,/,/,/,%,+,-}


你在一开始也有一些错误

第一(p)={id,输入,打印,e}

它将包括ε *在接下来的两个月里失踪了-

first(fact_tail) = { *,/, //, %, e} first(mult_op) = {*, /, //, %}
事实真相→ 多个事实尾部|ε

我猜你的意思是

事实真相→ 多因素事实尾ε

跟随

follow(stmt)={id,输入,打印,$}

如果你提到

stmt_列表→ stmt stmt|u列表|ε

然后stmt后面是stmt_列表的第一个,其中包括e,所以生成的字符串将结束,因此stmt后面是$

follow(expr)={(,id,number,),输入,打印,/,/,%}

我不知道你是怎么得到这个的,expr的follow等于stmt的follow和)

follow(expr)={id,),输入,打印,$}

follow(term_tail)等于follow(expr)

跟随(项)={+,-,),id,输入,打印,$}

follow(事实尾)等于follow(术语)

跟随(因子)=第一(事实尾)

后续(添加操作)=第一个(学期)

跟随(多个操作)=第一(因子)


所以我的follow(P)和follow(stmt_list)都是正确的吗?太棒了,这真的帮我弄明白了这个程序。我现在终于可以写程序来完成这个计算器语言的解析了!!!