没有合适的资源?快使用搜索试试~ 我知道了~
2021编译技术实验文法定义及相关说明1
需积分: 0 0 下载量 155 浏览量
2022-08-04
13:13:03
上传
评论
收藏 538KB PDF 举报
温馨提示
试读
13页
声明DeclConstDecl|VarDecl//覆盖两种声明常量声明 ConstDecl 'const' BType ConstDef { ',' Const
资源详情
资源评论
资源推荐
2021编译技术实验⽂法定义及相关说明
零、概要
SysY 语⾔是本次课程要实现的编程语⾔,是 C 语⾔的⼀个⼦集。每个 SysY 程序的源码存储在⼀个扩展
名为 sy 的⽂件中。该⽂件中有且仅有⼀个名为 main 的主函数定义,还可以包含若⼲全局变量声明、常
量声明和其他函数定义。SysY 语⾔⽀持 int 类型和元素为 int 类型且按⾏优先存储的多维数组类型,其
中 int 型整数为 32 位有符号数;const 修饰符⽤于声明常量。
SysY 语⾔通过getint与printf函数完成IO交互,函数⽤法已在⽂法中给出,需要同学们⾃⼰实现。
函数:函数可以带参数也可以不带参数,参数的类型可以是 int 或者数组类型;函数可以返回 int
类型的值,或者不返回值(即声明为 void 类型)。当参数为int 时,按值传递;⽽参数为数组类型
时,实际传递的是数组的起始地址,并且形参只有第⼀维的⻓度可以空缺。函数体由若⼲变量声明
和语句组成。
变量/常量声明:可以在⼀个变量/常量声明语句中声明多个变量或常量,声明时可以带初始化表达
式。所有变量/常量要求先定义再使⽤。在函数外声明的为全局变量/常量,在函数内声明的为局部
变量/常量。
语句:语句包括赋值语句、表达式语句(表达式可以为空)、语句块、if 语句、while 语句、break
语句、continue 语句、return 语句。语句块中可以包含若⼲变量声明和语句。
表达式:⽀持基本的算术运算(+、-、*、/、%)、关系运算(==、!=、<、>、<=、>=)和逻辑运
算(!、&&、||),⾮ 0 表示真、0 表示假,⽽关系运算或逻辑运算的结果⽤ 1 表示真、0 表示
假。算符的优先级和结合性以及计算规则(含逻辑运算的“短路计算”)与 C 语⾔⼀致。
⼀、输⼊输出函数定义
其中,FormatString为格式字符串终结符,其规范如下:
格式字符串中仅可能会出现⼀种转义字符'',⽤以标注此处换⾏,其他转义情况⽆需考虑。
对应的,语句<Stmt>的右侧需要添加上述输⼊输出语句,即
<InStmt> → <LVal> = 'getint''('')'
<OutStmt> → 'printf''('<FormatString>{,<Exp>}')'
<FormatChar> → %d
<NormalChar> → ⼗进制编码为32,33,40-126的ASCII字符
<Char> → <FormatChar> | <NormalChar>
<FormatString> → '"'{<Char>}'"'
如果希望在C语⾔中测试测试程序,只需要将getint加⼊函数声明即可,示例如下:
⼆、⽂法及覆盖要求
1. 覆盖要求
测试程序需覆盖⽂法中所有的语法规则(即每⼀条推导规则的每⼀个候选项都要被覆盖),并满⾜⽂法
的语义约束(换⽽⾔之,测试程序应该是正确的)。在下⼀节中,⽂法正⽂中以注释形式给出需要覆盖
的情况(注意函数形参表中 FuncFParam 数组声明需要为 ConstExp )。
2. ⽂法
SysY 语⾔的⽂法采⽤扩展的 Backus 范式(EBNF,Extended Backus-Naur Form)表示,其中:
符号[...]表示⽅括号内包含的为可选项
符号{...}表示花括号内包含的为可重复 0 次或多次的项
终结符或者是由单引号括起的串,或者是 Ident、InstConst 这样的记号
SysY 语⾔的⽂法表示如下,其中 CompUnit 为开始符号:
重要:建议同时对照⽂法第三部分的语义约束,使⽤⽀持侧栏书签的PDF阅读器进⾏跳转。
<Stmt> → <Stmt>
| <LVal> = 'getint''('')'';'
|'printf''('<FormatString>{,<Exp>}')'';'
int getint(){
int n;
scanf("%d",&n);
return n;
}
编译单元 CompUnit → {Decl} {FuncDef} MainFuncDef // 1.是否存在Decl 2.是否存在
FuncDef
声明 Decl → ConstDecl | VarDecl // 覆盖两种声明
常量声明 ConstDecl → 'const' BType ConstDef { ',' ConstDef } ';' // 1.花括号内重
复0次 2.花括号内重复多次
基本类型 BType → 'int' // 存在即可
常数定义 ConstDef → Ident { '[' ConstExp ']' } '=' ConstInitVal // 包含普通变
量、⼀维数组、⼆维数组共三种情况
常量初值 ConstInitVal → ConstExp
| '{' [ ConstInitVal { ',' ConstInitVal } ] '}' // 1.常表达式初值 2.⼀维数组初值
3.⼆维数组初值
变量声明 VarDecl → BType VarDef { ',' VarDef } ';' // 1.花括号内重复0次 2.花括号内
重复多次
变量定义 VarDef → Ident { '[' ConstExp ']' } // 包含普通变量、⼀维数组、⼆维数组定义
标识符Ident(需要覆盖的情况以注释形式给出):
| Ident { '[' ConstExp ']' } '=' InitVal
变量初值 InitVal → Exp | '{' [ InitVal { ',' InitVal } ] '}'// 1.表达式初值 2.⼀
维数组初值 3.⼆维数组初值
函数定义 FuncDef → FuncType Ident '(' [FuncFParams] ')' Block // 1.⽆形参 2.有形
参
主函数定义 MainFuncDef → 'int' 'main' '(' ')' Block // 存在main函数
函数类型 FuncType → 'void' | 'int' // 覆盖两种类型的函数
函数形参表 FuncFParams → FuncFParam { ',' FuncFParam } // 1.花括号内重复0次 2.花括
号内重复多次
函数形参 FuncFParam → BType Ident ['[' ']' { '[' ConstExp ']' }] // 1.普通变量
2.⼀维数组变量 3.⼆维数组变量
语句块 Block → '{' { BlockItem } '}' // 1.花括号内重复0次 2.花括号内重复多次
语句块项 BlockItem → Decl | Stmt // 覆盖两种语句块项
语句 Stmt → LVal '=' Exp ';' // 每种类型的语句都要覆盖
| [Exp] ';' //有⽆Exp两种情况
| Block
| 'if' '( Cond ')' Stmt [ 'else' Stmt ] // 1.有else 2.⽆else
| 'while' '(' Cond ')' Stmt
| 'break' ';' | 'continue' ';'
| 'return' [Exp] ';' // 1.有Exp 2.⽆Exp
| LVal = 'getint''('')'';'
| 'printf''('FormatString{,Exp}')'';' // 1.有Exp 2.⽆Exp
表达式 Exp → AddExp 注:SysY 表达式是int 型表达式 // 存在即可
条件表达式 Cond → LOrExp // 存在即可
左值表达式 LVal → Ident {'[' Exp ']'} //1.普通变量 2.⼀维数组 3.⼆维数组
基本表达式 PrimaryExp → '(' Exp ')' | LVal | Number // 三种情况均需覆盖
数值 Number → IntConst // 存在即可
⼀元表达式 UnaryExp → PrimaryExp | Ident '(' [FuncRParams] ')' // 3种情况均需覆盖,
函数调⽤也需要覆盖FuncRParams的不同情况
| UnaryOp UnaryExp // 存在即可
单⽬运算符 UnaryOp → '+' | '−' | '!' 注:'!'仅出现在条件表达式中 // 三种均需覆盖
函数实参表 FuncRParams → Exp { ',' Exp } // 1.花括号内重复0次 2.花括号内重复多次 3.
Exp需要覆盖数组传参和部分数组传参
乘除模表达式 MulExp → UnaryExp | MulExp ('*' | '/' | '%') UnaryExp //
1.UnaryExp 2.* 3./ 4.% 均需覆盖
加减表达式 AddExp → MulExp | AddExp ('+' | '−') MulExp // 1.MulExp 2.+ 需覆盖 3.-
需覆盖
关系表达式 RelExp → AddExp | RelExp ('<' | '>' | '<=' | '>=') AddExp // 1.AddExp
2.< 3.> 4.<= 5.>= 均需覆盖
相等性表达式 EqExp → RelExp | EqExp ('==' | '!=') RelExp // 1.RelExp 2.== 3.!=
均需覆盖
逻辑与表达式 LAndExp → EqExp | LAndExp '&&' EqExp // 1.EqExp 2.&& 均需覆盖
逻辑或表达式 LOrExp → LAndExp | LOrExp '||' LAndExp // 1.LAndExp 2.|| 均需覆盖
常量表达式 ConstExp → AddExp 注:使⽤的Ident 必须是常量 // 存在即可
剩余12页未读,继续阅读
高工-老罗
- 粉丝: 19
- 资源: 314
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0