1321: 实验2.8* 基于预测分析法的语法分析器设计

时间限制: C/C++ 1 s      Java/Python 3 s      内存限制: 128 MB      答案正确: 34 / 65     

题目描述

题目描述

编写一个程序,完成如下任务:

1.  输入文法产生式; 求出能推出ε的非终结符;  计算FIRST集和FOLLOW集;

2. 构造SELECT集, 判断文法是否为LL1文法。

3. 如果是LL1文法,构造预测分析表。

4. 编写LL(1)预测分析程序,  判断文法G所能接受的串。

输入

输入文法的产生式,输入#结束产生式的输入。

输入多行以#结尾的符号串,输入EOF结束。

输出

1. 输出文法符号是否导出空(ε);

2. 输出FIRST集合与FOLLOW集合, 第一列宽度为5,第二列宽度为10,其他列宽度为15;

3. 输出SELECT集合;

3. 判断文法是否为LL1文法,如果是LL1文法,输出"This is a LL(1) Grammar!",并输出LL1分析表,每列使用TAB键分隔;如果不是,则输出 "This is not a LL(1) Grammar!" 。

4. 判断每行输入的符号串在语法结构上是否合法,如果复杂算术表达式合法,输出"syntax correct"; 否则,输出"syntax error"

样例输入

E->TE'
E'->+TE'
E'->-TE'
E'->ε
T->FT'
T'->*FT'
T'->/FT'
T'->ε
F->(E)
F->i
#
i+i*i#
i+i*i+i*i*i#
i++#

样例输出

     =>ε      FIRST          FOLLOW         
E    false     {(,i}          {#,)}          
E'   true      {+,-,ε}       {#,)}          
T    false     {(,i}          {#,),+,-}      
T'   true      {*,/,ε}       {#,),+,-}      
F    false     {(,i}          {#,),*,+,-,/}  

SELECT(E->TE')={(,i}
SELECT(E'->+TE')={+}
SELECT(E'->-TE')={-}
SELECT(E'->ε)={#,)}
SELECT(T->FT')={(,i}
SELECT(T'->*FT')={*}
SELECT(T'->/FT')={/}
SELECT(T'->ε)={#,),+,-}
SELECT(F->(E))={(}
SELECT(F->i)={i}

This is a LL(1) Grammar!

     (    )    *    +    -    /    i    #    
E    TE'                           TE'       
E'        ε        +TE' -TE'           ε   
T    FT'                           FT'       
T'        ε   *FT' ε   ε   /FT'      ε   
F    (E)                           i         

syntax correct
syntax correct
syntax error

提示

来源

标签


提交代码






© 2012-2022 JustOJ 中文  English  | l.jiang.1024@gmail.com | System Info