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. //换行符: \n
  25. //制表符: \t
  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)|\n|\t|\0| ',事实上还有其他有关转义字符的组合,但是那些组合并没有特殊意义
  59. //所以在这里我们就不提那些组合了
  60. //这里我们将不支持科学计数法的表示
  61.  
  62. //
  63. //
  64. //现在我们讨论声明和定义部分
  65.  
  66. //unsign_constant_int : 0x((0-9)|(a-f)|(A-F))+|(0-9)+
  67. //sign_constant_int: -(0-9)+
  68. //unsign_constant_float: (0-9)+.(0-9)+
  69. //sign_constant_float:-unsign_constant_float
  70. //new_name: ((a-z)|(A-Z)|(-))+ ,即一个或多个合法的名称字符
  71. //
  72. //
  73. //
  74. //list_name: new_name|list_name[unsign_constant_int] 对应数组的情形
  75. //data_type_basic_body: int |char|float|double|long 基础类型体
  76. //data_type_basic_pointer: data_type_basic *|data_type_basic_pointer * 基础类型的指针
  77. //data_type_basic:data_type_basic_body|data_type_basic_pointer 基础类型(包括指针)
  78. //data_type_struct_direct: struct struct_direct_name //结构体类型
  79. //data_type_struct_alias: struct_alias_name 结构体重命名类型
  80. //data_type_union_direct: union union_direct_name 联合类型
  81. //data_type_union_alias: union_alias_name 联合重命名类型
  82. //data_type_struct_body: data_type_struct_direct|data_type_struct_alias 结构体不包括指针
  83. //data_type_struct_pointer: data_type_struct_body *|data_type_struct_pointer * 结构体指针
  84. //data_type_struct:data_type_struct_body|data_type_struct_pointer 结构体类型声明头部
  85. //data_type_union_body:data_type_union_direct|data_type_union_alias 联合类型
  86. //data_type_union_pointer:data_type_union_body * |data_type_union_pointer * 联合类型指针
  87. //data_type_union:data_type_union_body|data_type_union_pointer 联合类型声明头部
  88. //
  89. //data_type_definition:data_type_basic|data_type_struct|data_type_union 所有的类型头部
  90. //data_type_def_phrase: data_type_definition list_name; 内部 声明,不需要具名联合和结构
  91. //data_type_struct_anomynous: struct { in_block_def_list } new_name ; 内部结构体声明
  92. //data_type_union_anomynous: union { in_block_def_list } new_name; 内部联合声明
  93. //in_block_def: data_type_def_phrase|data_type_struct_anomynous|data_type_union_anomynous 内部声明类型
  94. //in_block_def_list: in_block_def| in_block_def_list in_block_def 内部声明列表
  95. //data_type_struct_decl: struct new_name { in_block_def_list } ; 外部结构体声明
  96. //data_type_struct_alias: typedef struct struct_direct_name new_name ; 外部结构体假名
  97. //data_type_union_decl: union new_name { in_block_def_list } ; 外部联合声明
  98. //data_type_union_alias: typedef union union_direct_name new_name ; 外部联合假名
  99. //data_type_decl_simple: data_type_definition_phrase|data_type_struct_decl|data_type_union_decl
  100. //外部声明,包括具名联合和结构
  101. //data_type_alias: data_type_struct_alias|data_type_union_alias 假名声明
  102. //data_type_com:data_type_decl_simple|data_type_alias 外部声明,包括联合结构及假名
  103. //data_type_com_list:data_type_com|data_type_com_list data_type_com 声明列表
  104. //data_type_decl_phrases:data_type_com_list 声明头
  105. //至此声明部分全部都结束了
  106. //当前语言的特点是所有的类型声明都需要在变量声明之前出现,但是结构体内部及联合内部声明不受此限制
  107. //现在开始变量声明部分
  108. //data_instance_decl_list : data_type_def_phrase| data_instance_decl_list data_type_def_phrase
  109. //data_instance_decl: data_instance_decl_list
  110. //至此变量声明结束
  111. //现在开始变量定义的处理
  112. //现在开始描述运算符的优先级
  113. //0级: [ ] ( ) -> . 结合性 从左到右
  114. //1级:! ~ ++ -- & * - (cast) sizeof 这些都是单目运算符,注意cast的意思是强制类型转换
  115. //2级: * / % 这些运算符都是从左到右
  116. //3级: + - 这些也是从左到右
  117. //4级: >> << 按道理木有结合性
  118. //5级:> < >= <= 从左到右
  119. //6级: == != 从左到右
  120. //7级: & 从左到右
  121. //8级:^ 从左到右
  122. //9级:| 从左到右
  123. //10级: && 从左到右
  124. //11级: ||从左到右
  125. //总共12级优先级,这里相对于c语言少了三个优先级,分别是条件运算符,逗号运算符和赋值运算符,
  126. //逗号和条件都是坑爹的存在,我是不想去实现他了,而对于赋值运算符,我把这个单独归类,放在文法分析里面去
  127. //
  128.  
  129. //首先考虑算术优先级
  130. //我们用优先级编号来命名临时的产生式
  131. //而且我们用左递归来完成从左到右的优先级
  132. //expression_0:constant|name|(expression_11)|expression_0[expression_11]|expression_0.name|expression_0->name
  133. //expression_1:expression_0|!expression_1|~expression_1|expression_1++|expression_1--|-expression_1
  134. // |&expression_1|*expression_1|(data_type_com)expression_1|sizeof expression_1
  135. //expression_2:expression_1|expression_2 * expression_1|expression_2 / expression_1| expression_2 % expression_1
  136. //expression_3:expression_2|expression_3 + expression_2 | expression_3 - expression_2|
  137. //expression_4:expression_3|expression_4 >> expression_3| expression_4 << expression_3
  138. //expression_5:expression_4|expression_5 > expression_4| expression_5 < expression_4| expression_5 >= expression_4
  139. // |expression_5 <= expression_4
  140. //expression_6:expression_5|expression_6 == expression_5|expression_6 != expression_5
  141. //expression_7:expression_6|expression_7 & expression_6
  142. //expression_8: expression_7|expression_8 ^ expression_7
  143. //expression_9: expression_8| expression_9 \| expression_8
  144. //expression_10:expression_9|expression_10 && expression_9
  145. //expression_11:expression_10|expression_11 \|\| expression_10
  146. //expression: expression_11
  147. //judeg_expression: expression_6
  148. //id_0: name |(id_0)| id_0[expression_11] | id_0.name | id_0->name
  149. //id_1: id_0 | * id_1
  150. //id : id_1
  151. //statement_0: id = expression ;| id ++ ;| id -- ;
  152. // simple_statements: statement_0| simple_statements statement_0
  153. //for_statement: for ( statement_0 ; judge_expression ; statement_0 ) { statements }
  154. //while_statement: while( judge_expression ) { statements }
  155. //branch_statement: if ( judge_expression) { statements } else { statements }
  156. // | if(judge_expression) { statements }
  157. //break_statement: break ;
  158. //statement: simple_statements | break_statement | branch_statement | while_statement |for_statement
  159. //statements: statement | statements statement

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

我的mini_c语言文法设计的更多相关文章

  1. C语言文法

    C语言文法 源程序 → 外部声明 | 子程序(外部声明) 外部声明   → 函数定义| 函数声明 函数定义 → 类型标识符(复合句) 标识符类型 → 无类型 | 字符型 | 整型 | 浮点型 整型→ ...

  2. 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

    阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...

  3. 1029 C语言文法定义与C程序的推导过程

    1 阅读并理解提供给大家的C语言文法文件. 2 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 3 给出一段C程序,写出用上述文法产生这段C程序的推导过程. program → exte ...

  4. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  5. C语言课程设计—图书管理系统

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...

  6. Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)

    #Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...

  7. C语言课程设计(成绩管理系统)

    C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...

  8. MySQL学习笔记_6_SQL语言的设计与编写(下)

    SQL语言的设计与编写(下) --SELECT查询精讲 概要: SELECT[ALL | DISTINCT] #distinct 明显的,清楚的,有区别的 {*|table.*|[table.]fie ...

  9. MySQL学习笔记_5_SQL语言的设计与编写(上)

    SQL语言的设计与编写(上) 一.SQL语句分类 数据定义语言(DDL): 用于定义和管理数据对象,包括数据库.数据表.视图.索引等.例如:CREATE.DROP.ALTER等语句. 数据操作语言(D ...

随机推荐

  1. Bootstrap新版里的a标签点击后出现下划线解决办法

    其实我从失去焦点后发现了下划线消失了就应该知道 Bootstrap对a标签进行了 focus焦点事件. 所以解决办法就是一句:a:focus{text-decoration: none}. 一个笑笑的 ...

  2. Ubuntu Nginx

    如果是阿云的ECS服务器,默认是已经安装了Apache服务器的,但一般都用不到,可以选择将它卸载 sudo service apache2 stop update-rc.d -f apache2 re ...

  3. TCP连接复用

    转自网络:看到一陌生名词,记录一下 TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上.这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带 ...

  4. BZOJ 4873 寿司餐厅(最大权闭合图 网络流)

    寿司餐厅 时间限制: 1 Sec  内存限制: 512 MB提交: 6  解决: 3[提交][状态][讨论版] 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序 ...

  5. 【Vijos 1607】【NOI 2009】植物大战僵尸

    https://vijos.org/p/1607 vijos界面好漂亮O(∩_∩)O~~ 对于一个植物x,和一个它保护的植物y,连一条边<x,y>表示x保护y,对于每个植物再向它左方的植物 ...

  6. [Arc080F]Prime Flip

    [Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...

  7. 【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes

    题意:有n个土豆,每个有体积V(i),你可以将每个土豆等分为不超过K份,问你最大块和最小块比值最小为多少. 直接枚举切法,只有n*K种,然后保证其为最大块,去算其他块的切法,即让其他块切得尽可能大即可 ...

  8. 【c++随手记】编程基础之输入输出

    今天试了下noi oj的1.1节,随便总结一下. [cout左对齐右对齐的方法] #include<iostream> #include<cstdio> #include< ...

  9. 1.2(JavaScript学习笔记)JavaScript HTML DOM

    一.DOM DOM全称为document object model(文档对象模型). 此处的文档指当前HTML文档,对象指HTML标签. 当网页被加载时,浏览器会创建页面的文档对象模型. 下面结合具体 ...

  10. Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

    C. Famil Door and Brackets 题目连接: http://www.codeforces.com/contest/629/problem/C Description As Fami ...