相关链接
编译原理:flex与bison–从0到1完成一个编译器(sample语言)〇
编译原理:flex与bison–从0到1完成一个编译器(sample语言)①
编译原理:flex与bison–从0到1完成一个编译器(sample语言)②
编译原理:flex与bison–从0到1完成一个编译器(sample语言)③
代码Github链接
Sample语言词法和语法说明
前言 本系列文章共三部分,记述了我完成编译器的过程,供后来的学弟学妹参考借鉴。
本项目是我的编译原理作业,文章是由实验报告整理而来的,重在阐述,如果没有编译原理的相关知识,还要结合一些教程来看。
本项目实现的编译器包括词法分析,语法分析,语义分析与中间代码生成,目标代码生成共四个阶段,能将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) <分程序> ::= <常量说明><变量说明><复合句>.