首先计算并遵循一组语法

时间:2018-04-28 05:05:00

标签: parsing compiler-construction grammar context-free-grammar

下面是我用于计算机语言的语法,以及我尝试查找跟随集和第一组语法的语法。

我想帮助弄清楚我在弄清楚我做错了什么,因为我觉得我根本没有正确地做到这些(至少对于以下几组)

语法

  

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)= {*,/,//,%,+, - }

1 个答案:

答案 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。我希望这可以帮助你