大三下编译原理课程大作业,选题:C语言子集编译器前端,由于时间有限和水平限制只做了一些简单功能。
1 功能
该编译器前端支持的语句有:表达式语句(算术表达式与逻辑表达式),while循环,if-else条件分支,变量定义与初始化语句以及多种语句组合成的符合语句。通过词法分析、语法分析、语义分析,最终生成四元式。本编译器前端只支持两种互相兼容的基本类型:int和char
2 文法设计
注意文法符号含义:int和char表示两种基本类型,integer和character表示两种类型的常量。
2.1 程序结构
-
程序:程序由语句序列构成
S -> statements -
语句:语句由条件语句、循环语句、复合语句、表达式语句构成
statement -> selectionStatement
statement -> whileStatement
statement -> compoundStatement
statement -> expressionStatement -
复合语句:符合语句由大括号包括,且变量的定义与初始化语句要在其他所有语句前面
compoundStatement -> ‘{’ declaration statements ‘}’ -
语句序列:添加M是为了在语义分析时可以正确的填next链
statements -> statements M statement
statements -> ‘#’
2.2 控制语句
语法分析部分采用自底向上的方案(SLR),而语义分析是用的SDT方案,在应用产生式规约的时候使用语义动作,所以对于嵌入产生式内部的动作需要添加空产生式进行执行。
由于表达式既可以用于赋值也可以用于流程控制。在流程控制时应当产生跳转语句,而其他时候不应当产生跳转语句,所以添加了文法符号T用于区别这两种情况。
- 循环语句
whileStatement -> ‘while’ M ‘(’ T ‘)’ M statement - 条件语句
selectionStatement -> ‘if’ ‘(’ T ‘)’ M statement
selectionStatement -> ‘if’ ‘(’ T ‘)’ M statement N ‘else’ M statement - 辅助语义分析的产生式
M -> ‘#’
N -> ‘#’
T -> expression
2.3 变量定义与初始化
- 类型说明:只能使用基本类型整型和字符型
typeSpecifier -> ‘int’
typeSpecifier -> ‘char’ - 变量定义语句
declaration -> typeSpecifier initDeclarator ‘;’ declaration
declaration -> typeSpecifier ‘;’
declaration -> ‘#’ - 初始化语句:用第一条则不赋初值,用第二天则对变量赋初值
initDeclarator -> ID
initDeclarator -> ID ‘=’ assignmentExp
2.4 表达式语句
表达式文法的产生式按运算符优先级排列,优先级越高距离基本因式越近,每个因式的具体构成(左递归还是右递归)取决于运算符的结合性。
- 表达式语句,即表达式后加冒号。
expressionStatement -> expression ‘;’
expressionStatement -> ‘;’ - 逗号表达式,连接多个表达式。这里在语义分析时要注意,形如
int a=(3+3,4+4);
的语句,取最右侧的值赋给a。
expression -> assignmentExp
expression -> expression ‘,’ assignmentExp - 赋值表达式
assignmentExp -> logicalOrExp
assignmentExp -> ID ‘=’ logicalOrExp - 逻辑或因式
logicalOrExp -> logicalAndExp
logicalOrExp -> logicalOrExp ‘||’ M logicalAndExp - 逻辑与因式
logicalAndExp -> equalityExp
logicalAndExp -> logicalAndExp ‘&&’ M equalityExp - 比较因式(相等与不等)
equalityExp -> relationalExp
equalityExp -> equalityExp ‘==’ relationalExp
equalityExp -> equalityExp ‘!=’ relationalExp - 比较因式(大于、小于、大于等于、小于等于)
relationalExp -> additiveExp
relationalExp -> relationalExp ‘<’ additiveExp
relationalExp -> relationalExp ‘<=’ additiveExp
relationalExp -> relationalExp ‘>’ additiveExp
relationalExp -> relationalExp ‘>=’ additiveExp - 加减因式
additiveExp -> multiplicativeExp
additiveExp -> additiveExp ‘+’ multiplicativeExp
additiveExp -> additiveExp ‘-’ multiplicativeExp - 乘除因式
multiplicativeExp -> unaryExp
multiplicativeExp -> multiplicativeExp ‘*’ unaryExp
multiplicativeExp -> multiplicativeExp ‘/’ unaryExp - 单目因式(单目减与单目加)
unaryExp -> primaryExp
unaryExp -> ‘-’ primaryExp
unaryExp -> ‘+’ primaryExp - 基本因式(常量、标识符或括号内的表达式)
primaryExp -> ID
primaryExp -> constant
primaryExp -> ‘(’ expression ‘)’ - 常量定义
constant -> integer
constant -> character