C语言子集编译器前端(一):文法设计

大三下编译原理课程大作业,选题: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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言子集编译器是一种专门用于编译C语言子集的软件工具。C语言子集是指C语言的一个部分,它包含C语言的一些核心语法和特性,但不包括全部的C语言功能。设计C语言子集编译器需要以下几个步骤: 1. 词法分析:首先,编译器需要将输入的源代码文件分成一个个的词法单元,例如标识符、关键字、运算符等。这一步骤将源代码转化为一系列的记号。 2. 语法分析:通过使用语法分析器,编译器可以根据C语言子集的语法规则来解析记号流,从而构建出语法树。语法树反映了源代码的结构和层次关系。 3. 语义分析:在这一步,编译器将进行类型检查和语义分析。它会检查变量的声明和使用是否正确,并进行类型匹配等操作。通过语义分析,编译器可以找出源代码中的错误和不合规范的地方。 4. 代码生成:在这一阶段,编译器将根据语法树生成目标代码。通常,目标代码是一个中间代码,如三地址码或抽象语法树。然后,编译器可以将中间代码转化为目标机器码。 5. 优化:最后,编译器可能会进行一些优化操作,以提高生成的目标代码的执行效率。例如,常量折叠、循环优化和死代码删除等。 通过以上的步骤,设计一个C语言子集编译器可以将C语言子集的源代码转化为机器可执行的目标代码。这个编译器可以为程序员提供方便,帮助他们快速开发和调试C语言子集的程序。同时,通过优化生成的代码,还可以提高程序的执行效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值