实现一个编译器(一)CFG的定义
来源:互联网 发布:台球软件 编辑:程序博客网 时间:2024/06/14 20:21
一直对编译挺感兴趣,学习时做过一个用LR的四则运算翻译程序。而总觉得很多地方理解的不够,正好有机会有老师愿意我来设计一门适于作程序设计基础教学的语言,要体现面向过程程序的特点,易学易用,不要有太多需要注意的语言细节,简而言之就是取代我们系里现在程序基础课中的用伪码,要像伪码一样好用。觉得很是喜欢,并有对自己一定挑战性,很愿意做下来,还有想着以后也许会有人用属于我的语言和我写的编译器来走上他们的编程入门之路就很兴奋,呵呵。
决定在这里把这个过程贴出来,算个人笔记,也算个自我激励,把它做完。
今天初步整理了出了语言的文法(BNF),具体的词法想用正则式来表示,只是为了做出来能有人用,语言细节还要区看老师的需求来敲定,词法就暂没做。
嗯,名字嘛,就暂定为water,我game时的ID。
CFG(BNF)暂定如下,肯定还要改,放在这里,算1.0版吧,呵呵:)
"<>"中部表示非终结符, "=>"为推出符号, 还有的就是非终结符了
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;}-->
1.语句部分:
1.1普通语句
<statement_list> => <statement_list><statement>
<statement_list> => <statement>
<statement> => <var_exp>; //声明
<statement> => <assign_exp>; //赋值
<statement> => <numerical_exp>; //运算
<statement> => <control_statement> //控制,没有分号
1.2复合语句
<compound_statement> => begin<statement_list>end //用begin,end分隔的若干语句
1.3控制语句(其执行部分都是一条复合语句)
<control_statement> => <for_statement>
<control_statement> => <while_statement>
<control_statement> => <do_statement>
<control_statement> => <if_statement>
1.4循环语句:
1.4.1for语句
<for_statemnt> => for(<numerical_exp>)<compound_statement>
1.4.2while语句
<while_statement> => while(<bool_exp>)<compound_statement>
1.4.3do_while语句
<do_statement> => do<compound_statement>while(<bool_exp>); //这里有分号
1.5条件语句
<if_statement>=> if(<bool_exp>)then<compound_statement>
<if_statement>=>if(<bool_exp>)then<compound_statement>else<compound_statement>
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;}-->
2表达式部分
2.1变量声明表达式与数据类型
<var_exp> => <type> ID
<var_exp> => array <type> ID[iConstant]
<type> => int;
<type> => real
<type> => bool
<type> => string;
2.2赋值表达式
<assign_exp> => ID:=<r_vlaue>
<r_value> => <numerical_exp>
<r_value> => <relation_exp>
<r_value> => <bool_exp>
<r_value> => <string>
2.2运算表达式部分:
2.3.1数值运算表达式:
<numerical_exp> => <numerical_exp><primary_op><advance_numerical_exp>
<numerical_exp> => <advance_numerical_exp>
<advance_numerical_exp> => <advance_numerical_exp><advance_op><final_numerical>
<advance_numerical_exp> => <final_numerical_exp>
<final_numerical_exp> => (<numerical_exp>)
<final_numerical_exp> => <function_call> //函数
<final_numerical_exp> => nID //数值变量
<final_numerical_exp> => nConstant //数值常量
<final_numerical_exp> => <array_exp> //数组元素
<primary_op> => +
<primary_op> => -
<advance_op> => * //*和/和mod具有较高优先级
<advance_op> => /
<advance_op> => mod
2.3.2关系运算表达式:
<relation_exp> => <primary> <relation_op> <primary>
<primary> => <numerical_exp>
<primary> => bID //布尔型变量
<primary> => bConstant //布尔型常数
<relation_exp> => <array_exp> //数组元素
<relation_op> => ==
<relation_op> => >
<relation_op> => <
<relation_op> => >=
<relation_op> => <=
<relation_op> => <>
2.3.3布尔运算表达式:
<bool_exp> => <bool_exp> <double_bool_op> <primary_bool_exp>
<bool_exp> => <primary_bool_exp>
<primary_bool_exp> => (<bool_exp>)
<primary_bool_exp> => not<primary_ bool_exp > //not具有较高优先级
<primary_bool_exp> => <function_all> //函数
<primary_bool_exp> => <relation_exp> //关系运算
<primary_bool_exp> => bID //布尔变量
<primary_bool_exp> => bConstant //布尔常数
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:612.0pt 792.0pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:36.0pt;mso-footer-margin:36.0pt;mso-paper-source:0;}div.Section1{page:Section1;}-->
<primary_bool_exp> => <array_exp> //数组元素
<double_bool_op> => and
<double_bool_op> => or
2.4数组引用表达式
<array_exp> => arrayID[<numerical_exp>]
2.5函数调用表达式
<function_call> => funID(<arg_list>)
<function_call> => funID(void)
<arg_list> => <arg_list>ID
<arg_list> => <arg_list>constant
<arg_list> => ID
<arg_liat> => constant
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;}-->
3程序体部分
<program> => <var_function_list><compound_statement>//规定函数在普通语句前定义
<program> => <compound_statement>
<var_function_list> => <var_function_list><var_function>
<var_function_list> => <var_function>
另:
外部文件包含(预处理阶段处理,文法分析不必考虑)
<extern_declare> => key_use(<file_list>)
<file_list> => <file_list>sConstant //常量字符串
- 实现一个编译器(一)CFG的定义
- 一个编译器(前端)的实现
- JAVA实现一个简单的代数运算语言编译器(一)--写在前面
- 实现一个简单的编译器
- 不知不觉,写了一个编译器(一)
- 编译器定义的宏
- 一个简单LR编译器的C++实现
- 一个简单编译器的实现过程
- 自制编译器,链接器(一)语言定义
- 用C实现C编译器(一)
- 大二的时候的一个小项目---实现四则运算的逻辑分析实现(小型编译器)
- 自己动手开发编译器(一)编译器的模块化工程
- _MSC_VER 定义编译器的版本
- _MSC_VER 定义编译器的版本
- _MSC_VER 定义编译器的版本
- 用Scheme写一个Scheme编译器(一)
- 《自己手动写一个编译器、连接器》一(1)
- 《自己手动写一个编译器、连接器》一(2)
- windows环境下Subversion(SVN)服务器和客户端安装备忘
- asp.net数据库访问学习心得
- 解释Android基本概念和构架的好资料
- html
- 欣闻荣获CSDN的MVB荣誉
- 实现一个编译器(一)CFG的定义
- 通信运营商在信息化路上举步维艰
- SWITCH语句(跳转表的结构)
- i++,i--执行效率
- Ext的gridpanel动态重新加载columnModel与store
- Linux学习笔记(4)----在Ubuntu下使用FileZilla的中文支持问题的解决
- 利用wmi获取杀软信息
- java 和 jstl多次替换js中的敏感字符
- 如何在SharePoint中Debug