编译原理语法分析器

需求分析

采用至少一种句法分析技术(LL(1)、SLR(1)、LR(1)或LALR(1))对类高级语言中的基本语句进行句法分析。阐述句法分析系统所要完成的功能。
(1)能识别以下几类语句:
声明语句(包括变量声明、数组声明、记录声明和过程声明)
表达式及赋值语句(包括数组元素的引用和赋值)
分支语句:if_then_else
循环语句:do_while
过程调用语句
(2)自动计算FIRST集和FOLLOW集,自动生成预测分析表
(3)具备语法错误处理能力,能准确给出错误所在位置,并采用可行的错误恢复策略。
(4)通过文件导入文法和测试用例,可以通过用户界面显示并编辑测试用例。
(5)打印输出语法分析器的FIRST集、FOLLOW集和LL(1)分析表(或LR分析表)。另一部分是打印输出语法分析结果。

我选的是LR(1)分析

思路分析

这里写图片描述 这里写图片描述
这里写图片描述
这里写图片描述

问题思考

  1. 关于用文件导入产生式,如何才能在文件中区分终结符和非终结符呢?
    答:产生式格式如下设计
Start P
P D
P S
S S S
D D D
D proc id ; D S
D T id ;
T X C
T record D
X int
X real
C [ num ] C
C
S id = E ;
S L = E ;
E E + E
E E * E
E - E
E ( E )
E id
E digit
E L
L id [ E ]
L L [ E ]
S if B then S
S if B then S else S
S while B do S
B B || B
B B && B
B ! B
B ( B )
B E < E
B E <= E
B E == E
B E != E
B E > E
B E >= E
S id ( Elist )
Elist Elist , E
Elist E

每一行表示一个产生式,然后非终结符的第一个字母都是大写,终结符的第一个字母小写。每行的第一个单词为产生式左部,其他为产生式右部,这样设计很方便读取。下面是老师给的原文法

要求:给出如下语言成分的文法描述。
   声明语句(包括变量声明、数组声明、记录声明和过程声明)
   表达式及赋值语句(包括数组元素的引用和赋值)
   分支语句:if_then_else 
   循环语句:do_while 
   过程调用语句
/*声明*/
DD D | proc id ; D S | T id;             
T  → X C |  record D                        
X  → integer | real                 
C  → [num]C | ε                     

/*赋值语句*/
S → id = E ;| L = E ;                   
EE + E | E * E | -E | (E) | id | digit | L   
L → id[E] | L[E]                        

/*控制流语句*/
S → if B then S1                        
| if B then S1 else S2              
    | while B do S1                 
B → B or B                          
    | B and B                       
    | not B                             
    | (B)                           
    | E relop E                         
    | true                          
    | false                         
relop → < | <= | == | != | > | >=           
/* 过程调用*/
S →call id (Elist)                      
Elist→ Elist, E                     
Elist → E                               
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值