当前位置: 首页 > 形式语言与编译 > 正文

自制编译器,链接器(一)语言定义

RCC 编译器,链接器
RCC语言定义
1.支持双字节,双字节,四字节的基本数据结构。
2.支持数组,结构体。
3.支持字符串。
4.支持函数,局部变量,全局变量。
5.支持条件语句,循环语句。
6.支持基本的算术运算,关系运算。
7.只保留一种循环(for ,while,do)
基本字符集
1.字母与下划线
英文字母小写26个,英文字母大写26个。
2.下划线
3.10个数字
4.标点和特殊字符
5.空白字符
关键字
定义
语义
char
声明字符类型变量或函数
short
声明短整型变量或函数
int
声明整型变量或函数
void
声明函数无返回值,声明无类型指针
struct
声明结构体变量
if
条件语句
else
条件语句与否定分支
for
循环语句
continue
结束当前循环,开始下一轮循环
break
跳出当前循环
return
子程序返回语句
sizeof
计算类型长度
__cdecl
__cdecl调用约定
__stdcall
__stdcall 调用约定
__align
__align(n) 强制结构成员对齐

标识符
1.标识符 标识符 ::非数字|数字|非数字 非数字 ::字符 数字 ::数字
解释: 表识符只能是字母,数字,下划线,组成的语言字符串,并且其中第一个字符必须是字母和下划线。
2.整数常量 整数常量::数字 数字 整数常量由十进制数字序列组成
3.字符常量 字符常量::C字符 C字符::转移字符|字符
4.转义字符表
源码字符形式
含义
执行ASCII码
\0
空字符
0
\a
响铃
7
\b
退格
8
\t
水平制表
9
\n
换行
10
\v
纵向转义
11
\f
换页
12
\r
回车
13
\”
代表一个双引号字符
34
\’
代表一个单引号字符
39
\
代表一个反斜杠
92

5.字符串常量 字符串::串字符 串字符::转义|源字符|其它字符
6.运算符与分隔符 + – * / % == !=< <=
= -> . & ( ) [ ] { } ; , …
总共22个字符。
7.约束 所有的括号必须配对出现。
8.语义 算符说明要执行的运算,该运算产生一个值,或者一个负作用。
9.注释 /**/ 不允许嵌套
RCC语言语法定义
1.外部定义
<翻译单元>::= {<外部声明>}<文件结束符>
<外部声明>::= <函数定义>|<声明>
每个C文件都是一个翻译单元,它由一系列的外部声明组成.
2.函数定义
<函数定义>::=<类型区分符><声明符><函数体>
<函数体>::=<复合语句>
3.声明
<声明>::<类型区分符>[<初值声明符表>]<分号>
<初值声明符表>::=<初值声明符>{<逗号><初值说明符>}
<初值说明符>::= <声明符>|<声明符><赋值运算符><初值符>
3.类型区分符
<类型区分符>::||||<结构区分符>
<结构区分符>::=<标识符><{><结构声明表><}>|<标识符>
<结构声明表>::<结构声明>{<结构声明>}
<结构声明>::=<类型区分符>{<结构声明符表>}<分号>
<结构声明符表>::= <声明符>{<逗号><声明符>}
4.声明符
<声明符>::= {<指针>}[<调用约定>][<结构体成员对齐>]<直接声明符>
<调用约定>:: <_cdecl >|<_stdcall>
<结构体成员对齐>::<_align><(><)>
<指针>::=<星号>
<直接声明符>::<标示符><直接声明符后缀>
<直接声明符后缀>::{ <[> <]> | <[><]> | <(><)> | <(><)>}
<参数声明>::=<类型区分符><声明符>
5.初值符
<初值符>::=<赋值表达式>
6.语句
<语句>::={< 符合语句 > | }
<复合语句>::=<{> {<声明>}{<语句>} <}>
<表达式语句>::[]<分号>
::<(><)>[]
::<(> <)>
:: <;>
:: <;>
::<;>
<表达式>::= <赋值表达式>{<逗号><赋值表达式>}
<赋值表达式>::<相等类表达式> | <一元表达式> <赋值等号> <赋值表达式>
<相等类表达式>::<关系表达式> {<=> | <!=> }
<关系表达式>::= <加减类表达式>{ <“<“> <加减EXP> <“>”> <加减EXP> <“<=”> <加减EXP> <“>=”> <加减EXP>}
<加减类表达式>::=<乘除表达式>{ <+><乘除表达式>| <-><乘除表达式>}
<乘除表达式>::<一元表达式>{ <*><一元表达式>| <一元表达式>| <%><一元表达式>}
<一元表达式>::=<后缀表达式> |<&><一元表达式> |<*><一元表达式> |<+><一元表达式> |<-><一元表达式> |
::=(<类型区分符>)
<后缀表达式>::=<初等表达式>{ <[> <]> |<(><)> |<(><实参表达式表><)> |<.>indentifier |<->>indentifier
<实参表达式表>::=<赋值表达式>{<,><赋值表达式>}
<初等表达式>::=<标识符>|<整数常量>|<字符串常量>|<字符常量>|()

本文固定链接: http://zmrlinux.com/2016/11/27/%e8%87%aa%e5%88%b6%e7%bc%96%e8%af%91%e5%99%a8%e9%93%be%e6%8e%a5%e5%99%a8%ef%bc%88%e4%b8%80%ef%bc%89%e8%af%ad%e8%a8%80%e5%ae%9a%e4%b9%89/ | Kernel & Me

该日志由 root 于2016年11月27日发表在 形式语言与编译 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 自制编译器,链接器(一)语言定义 | Kernel & Me