栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号