我的mini_c语言文法设计

  1 //这个文件主要是用来描述当前源语言的词法结构和语法结构
  2 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉
  3 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此做不来
  4 //如果有想做预处理的同志,可以自行修改代码。
  5 //本代码完全木有任何版权,因此各位读者在使用过程中由于程序bug而造成的挂科、失恋、车祸、离婚等不良后果
  6 //楼主不负任何法律责任,钦此。
  7 //下面来描述词法中的字符集
  8 //
  9 //
 10 //变量名称符:大小写字母和下划线,注意这里并不支持数字,变量名字中有数字是很不科学的,个人认为,而下划线在
 11 //使得变量名称可读这方面有很重要的作用,因此这里会支持
 12 //算术及逻辑运算符: < > <= >= == + - * & | ! ^ && || / ++ -- ~ %
 13 //赋值运算符: =
 14 //取地址运算符: &
 15 //指针运算符: *
 16 //结构体分量运算符: .
 17 //结构体指针分量运算符: ->
 18 //数组运算符: [ ]
 19 //函数运算符: ( )
 20 //内存大小运算符: sizeof( )
 21 //行尾界定符: ;
 22 //字符串界定符: " "
 23 //字符界定符: ' '
 24 //换行符: 

 25 //制表符: 	
 26 //单元界定符: ( )
 27 //空格符: 
 28 //转义字符:  说明,转义字符与其之后的那一个字符会被当作一个单元来处理,即直接输出其之后的字符
 29 //注意,转义字符只会在字符及字符串中进行使用,其他情况下会被解释为除法运算符
 30 //代码块界定符: { }
 31 //
 32 //下面来介绍一下关键字
 33 //sizeof ,大家对这个很熟悉了吧,不解释
 34 //for ,不解释
 35 //while 不解释
 36 //if 不解释
 37 //else 不解释
 38 //break 不解释
 39 //注意我这个语言取消了goto和switch,case,因为goto容易引起混乱,而switch的语法结构对我来说有点复杂,
 40 //而且这个分支结构总是能够转变为for语句加上break的模式,因此我当前就不添加了,有兴趣的人可以自己去修改
 41 //下面说的是类型关键字
 42 //int 不解释
 43 //float 不解释
 44 //long 不解释
 45 //double 不解释
 46 //char 不解释
 47 //struct 不解释
 48 //union 不解释
 49 //注意这里我们取消了枚举类型,因为如果对这个类型进行处理的话,会让我很烦躁
 50 //下面还有类型别名关键字
 51 //typedef 
 52 //现在我们开始对这个做词法单元分类
 53 //注意这里我们只支持十进制和十六进制,8进制直接被忽略,
 54 //而且对于整数常量,我们默认为64位,因此对于十进制,我们支持18位数字
 55 //而对于浮点数,由于默认常量为双精度,所以我们允许,小数点后有10位,,小数点之前最多36位
 56 //这里我只是照搬c语言里面的规定,事实上,需要这么多位并要求精确计算的还是用大数来算吧。
 57 //不要指望系统自带的算术精度
 58 //constant_char:'(a-b)|(A-B)|(0-9)|
|	|| ',事实上还有其他有关转义字符的组合,但是那些组合并没有特殊意义
 59 //所以在这里我们就不提那些组合了
 60 //这里我们将不支持科学计数法的表示
 61 
 62 //
 63 //
 64 //现在我们讨论声明和定义部分
 65 
 66 
 67 //unsign_constant_int : 0x((0-9)|(a-f)|(A-F))+|(0-9)+
 68 //sign_constant_int: -(0-9)+
 69 //unsign_constant_float: (0-9)+.(0-9)+
 70 //sign_constant_float:-unsign_constant_float
 71 //new_name: ((a-z)|(A-Z)|(-))+  ,即一个或多个合法的名称字符
 72 //
 73 //
 74 //
 75 //list_name: new_name|list_name[unsign_constant_int] 对应数组的情形
 76 //data_type_basic_body: int |char|float|double|long  基础类型体
 77 //data_type_basic_pointer: data_type_basic *|data_type_basic_pointer * 基础类型的指针
 78 //data_type_basic:data_type_basic_body|data_type_basic_pointer 基础类型(包括指针)
 79 //data_type_struct_direct: struct struct_direct_name  //结构体类型
 80 //data_type_struct_alias: struct_alias_name                结构体重命名类型
 81 //data_type_union_direct: union union_direct_name        联合类型
 82 //data_type_union_alias: union_alias_name                联合重命名类型
 83 //data_type_struct_body: data_type_struct_direct|data_type_struct_alias 结构体不包括指针
 84 //data_type_struct_pointer: data_type_struct_body *|data_type_struct_pointer * 结构体指针
 85 //data_type_struct:data_type_struct_body|data_type_struct_pointer                结构体类型声明头部
 86 //data_type_union_body:data_type_union_direct|data_type_union_alias                联合类型
 87 //data_type_union_pointer:data_type_union_body * |data_type_union_pointer *        联合类型指针
 88 //data_type_union:data_type_union_body|data_type_union_pointer                    联合类型声明头部
 89 //
 90 //data_type_definition:data_type_basic|data_type_struct|data_type_union            所有的类型头部
 91 //data_type_def_phrase: data_type_definition list_name;                            内部 声明,不需要具名联合和结构
 92 //data_type_struct_anomynous: struct { in_block_def_list } new_name ;            内部结构体声明
 93 //data_type_union_anomynous:  union { in_block_def_list } new_name;                内部联合声明
 94 //in_block_def: data_type_def_phrase|data_type_struct_anomynous|data_type_union_anomynous  内部声明类型
 95 //in_block_def_list: in_block_def| in_block_def_list in_block_def                内部声明列表
 96 //data_type_struct_decl: struct new_name { in_block_def_list } ;                外部结构体声明
 97 //data_type_struct_alias: typedef struct struct_direct_name new_name ;            外部结构体假名
 98 //data_type_union_decl: union new_name { in_block_def_list } ;                    外部联合声明
 99 //data_type_union_alias: typedef union union_direct_name new_name ;                外部联合假名
100 //data_type_decl_simple: data_type_definition_phrase|data_type_struct_decl|data_type_union_decl 
101 //外部声明,包括具名联合和结构
102 //data_type_alias: data_type_struct_alias|data_type_union_alias 假名声明
103 //data_type_com:data_type_decl_simple|data_type_alias 外部声明,包括联合结构及假名
104 //data_type_com_list:data_type_com|data_type_com_list data_type_com 声明列表
105 //data_type_decl_phrases:data_type_com_list                            声明头
106 //至此声明部分全部都结束了
107 //当前语言的特点是所有的类型声明都需要在变量声明之前出现,但是结构体内部及联合内部声明不受此限制
108 //现在开始变量声明部分
109 //data_instance_decl_list : data_type_def_phrase| data_instance_decl_list data_type_def_phrase
110 //data_instance_decl: data_instance_decl_list
111 //至此变量声明结束
112 //现在开始变量定义的处理
113 //现在开始描述运算符的优先级
114 //0级: [ ] ( ) -> . 结合性 从左到右
115 //1级:! ~ ++ -- & * - (cast)  sizeof 这些都是单目运算符,注意cast的意思是强制类型转换
116 //2级: * / % 这些运算符都是从左到右 
117 //3级: + - 这些也是从左到右 
118 //4级: >> << 按道理木有结合性
119 //5级:> < >= <= 从左到右
120 //6级: == != 从左到右
121 //7级: & 从左到右
122 //8级:^ 从左到右
123 //9级:| 从左到右
124 //10级: && 从左到右
125 //11级: ||从左到右
126 //总共12级优先级,这里相对于c语言少了三个优先级,分别是条件运算符,逗号运算符和赋值运算符,
127 //逗号和条件都是坑爹的存在,我是不想去实现他了,而对于赋值运算符,我把这个单独归类,放在文法分析里面去
128 //
129 
130 
131 //首先考虑算术优先级
132 //我们用优先级编号来命名临时的产生式 
133 //而且我们用左递归来完成从左到右的优先级
134 //expression_0:constant|name|(expression_11)|expression_0[expression_11]|expression_0.name|expression_0->name
135 //expression_1:expression_0|!expression_1|~expression_1|expression_1++|expression_1--|-expression_1
136 //                |&expression_1|*expression_1|(data_type_com)expression_1|sizeof expression_1
137 //expression_2:expression_1|expression_2 * expression_1|expression_2 / expression_1| expression_2 % expression_1
138 //expression_3:expression_2|expression_3 + expression_2 | expression_3 - expression_2|
139 //expression_4:expression_3|expression_4 >> expression_3| expression_4 << expression_3
140 //expression_5:expression_4|expression_5 > expression_4| expression_5 < expression_4| expression_5 >= expression_4
141 //                |expression_5 <= expression_4
142 //expression_6:expression_5|expression_6 == expression_5|expression_6 != expression_5
143 //expression_7:expression_6|expression_7 & expression_6
144 //expression_8: expression_7|expression_8 ^ expression_7
145 //expression_9: expression_8| expression_9 | expression_8
146 //expression_10:expression_9|expression_10 && expression_9
147 //expression_11:expression_10|expression_11 || expression_10
148 //expression: expression_11
149 //judeg_expression: expression_6
150 //id_0: name |(id_0)| id_0[expression_11] | id_0.name | id_0->name
151 //id_1: id_0 | * id_1
152 //id : id_1
153 //statement_0: id = expression ;| id ++ ;| id -- ;
154 // simple_statements: statement_0| simple_statements statement_0
155 //for_statement: for ( statement_0 ; judge_expression ; statement_0 ) { statements }
156 //while_statement: while( judge_expression ) { statements }
157 //branch_statement: if ( judge_expression) { statements } else { statements }
158 //                    | if(judge_expression) { statements }
159 //break_statement: break ;
160 //statement: simple_statements | break_statement | branch_statement | while_statement |for_statement
161 //statements: statement | statements statement


当前版本还不支持函数,下个版本即将支持,其实改动量很少啦,不过因为明天去旅游,就不改了。当整个文法定型以后,我将先着手符号表的格式。

原文地址:https://www.cnblogs.com/huangfeidian/p/3176727.html