大三下编译原理课程大作业,选题: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
|