编译原理:flex与bison--从0到1完成一个编译器(sample语言)〇

相关链接

编译原理:flex与bison–从0到1完成一个编译器(sample语言)〇
编译原理:flex与bison–从0到1完成一个编译器(sample语言)①
编译原理:flex与bison–从0到1完成一个编译器(sample语言)②
编译原理:flex与bison–从0到1完成一个编译器(sample语言)③
代码Github链接


前言

本系列文章共三部分,记述了我完成编译器的过程,供后来的学弟学妹参考借鉴。
本项目是我的编译原理作业,文章是由实验报告整理而来的,重在阐述,如果没有编译原理的相关知识,还要结合一些教程来看。
本项目实现的编译器包括词法分析,语法分析,语义分析与中间代码生成,目标代码生成共四个阶段,能将sample语言翻译成可执行的汇编语言。使用flex与bison工具辅助,通过C语言实现。本人能力有限,项目有许多不足和值得改进的地方,也请读者多多指正。

本文为本系列的第0部分,是Sample语言的词法和语法。

Sample语言简介

Sample语言是PASCAL语言的简化版本。具有一般高级语言的共同特征:它的字符集包括所有的大小写字母、数字和一些界符;有多种数据类型:整型、实型、字符型等;有变量说明和常量说明;包括顺序、条件和循环三种语句结构。

Sample语言字符集的定义

(1) <字符集> ::= <字母>|<数字>|<单界符>

(2) <字母> ::= a|b|c…|z|A|B|C…|Z

(3) <数字> ::= 0|1|2|3…|9

(4) <单界符> ::= +|-|*|/|=|<|>|(|)|:|;|,|'|_|.

Sample语言单词的定义

(1) <单词> ::= <保留字>|<双界符>|<标识符>|<常数>|<单界符>

(2) <保留字> ::= and|begin|bool|char|const|do|else|end|false |for|if|input|integer|not|or|output|program |read|real|repeat|then|to|true|until|var|while|write

(3) <双界符> ::= /|/|<=|>=|<>|:=

(4) <标识符> ::= <字母>|<标识符><数字>|<标识符><字母>

(5) <常数> ::= <整数>|<布尔常数>|<字符常数>|<常数标识符>|<实数>

(6) <整数> ::= <数字>|<整数><数字>

(7) <布尔常数> ::= true|false

(8) <字符常数> ::= 除’以外的任意字符

(9) <常数标识符> ::= <标识符>

(10)<实数> ::= <整数>.<整数>

<常数> ::= <整数>|<布尔常数>|<字符常数>|<实数> |<八进制数>|<十六进制数>|<指数形式小数>

<布尔常数> ::= true|false

Sample语言数据类型的定义

<简单类型> ::= integer|bool|char|real

Sample语言表达式的定义

(1) <表达式> ::= <算术表达式>|<布尔表达式>

(2) <算术表达式> ::= <算术表达式>±<项>|±<项>|<项>

(3) <项> ::= <项>*<因子>|<项>/<因子>|<因子>

(4) <因子> ::= <算术量>|(<算术表达式>)

(5) <算术量> ::= <标识符>|<整数>

(6) <布尔表达式> ::= <布尔表达式> or <布尔项> |<布尔项>

(7) <布尔项> ::= <布尔项> and <布尔因子> |<布尔因子>

(8) <布尔因子> ::= <布尔量> | not<布尔因子>

(9) <布尔量> ::= (<布尔表达式>) | <布尔常数>|<标识符> |(<算术表达式><关系符><算术表达式>)

(10) <关系符> ::= <|>|<>|<=| >=| =

Sample语言语句的定义

(1) <语句> ::= <说明语句>|<执行语句>

(2) <说明语句> ::= <常量说明><变量说明>

(3) <常量说明> ::= const <常数定义>;|e

(4) <常数定义> ::= <常数定义>;<变量>:=<常数>|<变量>:=<常数>

(5) <变量说明> ::= var <变量定义>;|e

(6) <变量定义> ::= <标识符表>:<类型>|<变量定义> ;<标识符表>:<类型>

(7) <标识符表> ::= <变量>, <标识符表>|<变量>

(8) <执行语句> ::= <简单句>|<结构句>

(9) <简单句> ::= <赋值语句> ;

(10) <赋值语句> ::= <变量>:=<表达式>

(11) <变量> ::= <标识符>

(12) <结构句> ::= <复合句>|<if语句>|<while语句> |<for语句>|<repeat语句>

(13) <复合句> ::= begin <语句表> end

(14) <语句表> ::= <执行语句><语句表>|<执行语句>

(15) <if语句> ::= if <布尔表达式> then <执行语句>

(16) <if语句> ::= if <布尔表达式> then <执行语句> else <执行语句>

(15) <if语句> ::= <I_F> then <执行语句>

<I_F> ::= if <布尔表达式>

(16) <if语句> ::= <I_F_E> <执行语句>

<I_F_E> ::= if <布尔表达式> then <执行语句> else

(17) <while语句> ::= while <布尔表达式> do <执行语句>

(17) <while语句> ::= do <执行语句>

:= <布尔表达式>

:= while

(18) <for语句> ::= for <标识符>:=<算术表达式> to <算术表达式> do <执行语句>

(18) <for语句> ::= <F_T> do <执行语句>

<F_T> := for <标识符>:=<算术表达式> to <算术表达式>

(19) <repeat语句> ::= repeat <执行语句> until <布尔表达式>

(19) <repeat语句> ::=<R_U> <布尔表达式>

<R_U> := <执行语句> until

:= repeat

Sample语言程序的定义

(1) <程序> ::= program <标识符>;<分程序>

(2) <分程序> ::= <常量说明><变量说明><复合句>.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值