论文部分内容阅读
摘要:传统的C、C 、Java编译系统大而全,集成了大量的库和框架,足让开发者使用非常方便,却不利于开发者对编译理论与技术的理解。该文针对上述问题,研究了简單的代码编译器的技术构成,开发出了一个具有通用意义的简单编译系统,可使读者更好地学习编译原理和技术并提高对这门课的兴趣。首先,该文对Tina解释器的主要功能和应用进行了概述,并对其执行过程进行了分析和讨论;针对该研究领域的实际情况,提出了Tina解释器的设计方法。 其次,从Tina的代码结构和格式入手,分析了常见的词法、语法问题;研究了编译技术,并对程序的控制结构、判断的解析过程进行详细的分析。编译过程分为词法分析、语法分析以及代码生成和处理三个阶段。以Windows系统为开发平台、以C语言为开发工具,运用递归技术和链表、队列、栈等数据结构对这三个模块进行了具体的设计。
关键词:编译技术;解释器;词法分析;语法分析
中图分类号:TP314 文献标识码:A 文章编号:1009-3044(2018)14-0223-03
Abstract: The traditional C、C 、Java compiler system are large and integrate a large number of libraries and frameworks, allowing developers to use conveniently, are not conducive to understand the compiler theory and technology. In this paper, aiming at the above problems, we research the a simple structure of code compiler technology, developed a simple compiler system with common sense,making the reader betterly learn compiler theory and technology and increasing the interest of this course. Firstly, the main features and applications what Tina interpreter were discussed, and the analysis and discussion of the implementation process. The actual situation in the field of researching, proposed Tina compiler which is the design method of this solution. Secondly, from code structure and format of Tina, it analyzes the common lexical, grammatical problems. Research on the compiler technology, control structures and procedures, parsing judgment for detailed analysis. Compilation process is divided into lexical analysis, syntax analysis and code generation three processing stages,which let the Windows system as the development platform and let C language as development tools and use recursive technique and the data structure of lists and queue and stacks implementing the three modules of the specific design.
Key words: compiler technology; lexical analysis; lexical analysis; interpreter parsing
1 Tina解释器功能简介
Tina解释器程序完成从源程序的输入、预处理、加载、词法分析、语法分析、语义分析并生成中间逆波兰表达式、用虚拟机执行中间代码、返回结果等一系列过程[1-3],其中包括对while、for、if、function、var、expression、class、array、return、print、API(系统自带函数)的解释过程。Tina是个很小的脚本语言解释器,支持类的继承和加、减、乘、除、与、或运算,可以输出字符串和经基本运算处理后的结果,并且假设程序员编写的应用程序没有语法错误[4]。Tina是用C语言设计的一款简单脚本语言,其中主要运用了栈、队列、链表、数组等简单数据结构。它实现的功能过于简单,并无商业价值可言,仅仅是让人们对编译理论的实现以及编译技术有一个更好的理解[5]。图1是用Tina写的应用程序,图2是程序的输出结果。
2 Tina解释器的执行过程
程序从解释器的主函数开始,如果未加说明则解释执行本地的test.tina脚本,然后向虚拟机中注册一个函数,输入它在脚本中的名字,以及它的函数指针、参数个数,函数的样式为 void API_FUNC ()。之后建立函数,分三步:第一步,加载;第二步,预处理;第三步,扫描。每一步都有一个独立的C程序模块对Tina脚本进行处理,下面分别介绍之。
(1) 加载。把以.tina为后缀的源文件作为函数输入,通过C语言自带的读文件函数,把读到的所有源文件的字符全部放入缓冲区中,等待下一步的处理。 (2) 预处理。从缓冲区中读出源程序,并且去掉单行注释和块注释。
(3) 扫描。扫描进行三遍,第一遍扫描, 如图3所示,扫描所有的全局函数声明,用token_get()函数进行词法分析和语法分析[6],把扫描到的字符放到图4所示的t_k结构体中,并根据扫描到的符号类型,来判断是否为函数符号。如果是,则调用函数定义解析模块进行解析;如果扫描到的是类,则略过类的名字和定义块。第二遍扫描,扫描所有类的定义,发现类的定义并调用类解析模块进行解析。第三遍扫描,发现函数的名字以及定义,并调用函数定义解析模块进行解析。这三遍中用到的解析模块以及进行词法分析的token_get()函数将在后面介绍[7]。
3 Tina解释器的体系结构
Tina解释器的体系结构从主程序模块main.c开始,这个模块包括五个部分,其中构建模块也包括五个部分,函数解析模块包含七部分:词法分析模块,贯穿整个函数解析模块;中间代码执行模块调用函数解析模块、虚拟机运行模块、API解析模块和变量处理模块;变量处理和表达式解析模块会调用词法分析、变量处理、函数解析模块。
3.1 token_get()函数
从当前位置(pos)解析一个词法标记,并将词法标记的相关信息存入t_k所指向的TokenInfo对象里,解析之后,当前位置会向后跳跃一个词法标记,我们假设整个待输入的缓存中的词法是无错的(即不存在无效的词法单元)。
首先,刷新t_k的字符串内容,建立临时储存词法标记字符串的数组并且清零。检测是否已经到了文件尾并且删除前导空白符(回车、换行、空格),检查复合运算符(>=,<=,==,!=, =,-=,*=,/=)、运算符(., ,-,*,/,>,<,=,(,[)、引用标记(
关键词:编译技术;解释器;词法分析;语法分析
中图分类号:TP314 文献标识码:A 文章编号:1009-3044(2018)14-0223-03
Abstract: The traditional C、C 、Java compiler system are large and integrate a large number of libraries and frameworks, allowing developers to use conveniently, are not conducive to understand the compiler theory and technology. In this paper, aiming at the above problems, we research the a simple structure of code compiler technology, developed a simple compiler system with common sense,making the reader betterly learn compiler theory and technology and increasing the interest of this course. Firstly, the main features and applications what Tina interpreter were discussed, and the analysis and discussion of the implementation process. The actual situation in the field of researching, proposed Tina compiler which is the design method of this solution. Secondly, from code structure and format of Tina, it analyzes the common lexical, grammatical problems. Research on the compiler technology, control structures and procedures, parsing judgment for detailed analysis. Compilation process is divided into lexical analysis, syntax analysis and code generation three processing stages,which let the Windows system as the development platform and let C language as development tools and use recursive technique and the data structure of lists and queue and stacks implementing the three modules of the specific design.
Key words: compiler technology; lexical analysis; lexical analysis; interpreter parsing
1 Tina解释器功能简介
Tina解释器程序完成从源程序的输入、预处理、加载、词法分析、语法分析、语义分析并生成中间逆波兰表达式、用虚拟机执行中间代码、返回结果等一系列过程[1-3],其中包括对while、for、if、function、var、expression、class、array、return、print、API(系统自带函数)的解释过程。Tina是个很小的脚本语言解释器,支持类的继承和加、减、乘、除、与、或运算,可以输出字符串和经基本运算处理后的结果,并且假设程序员编写的应用程序没有语法错误[4]。Tina是用C语言设计的一款简单脚本语言,其中主要运用了栈、队列、链表、数组等简单数据结构。它实现的功能过于简单,并无商业价值可言,仅仅是让人们对编译理论的实现以及编译技术有一个更好的理解[5]。图1是用Tina写的应用程序,图2是程序的输出结果。
2 Tina解释器的执行过程
程序从解释器的主函数开始,如果未加说明则解释执行本地的test.tina脚本,然后向虚拟机中注册一个函数,输入它在脚本中的名字,以及它的函数指针、参数个数,函数的样式为 void API_FUNC ()。之后建立函数,分三步:第一步,加载;第二步,预处理;第三步,扫描。每一步都有一个独立的C程序模块对Tina脚本进行处理,下面分别介绍之。
(1) 加载。把以.tina为后缀的源文件作为函数输入,通过C语言自带的读文件函数,把读到的所有源文件的字符全部放入缓冲区中,等待下一步的处理。 (2) 预处理。从缓冲区中读出源程序,并且去掉单行注释和块注释。
(3) 扫描。扫描进行三遍,第一遍扫描, 如图3所示,扫描所有的全局函数声明,用token_get()函数进行词法分析和语法分析[6],把扫描到的字符放到图4所示的t_k结构体中,并根据扫描到的符号类型,来判断是否为函数符号。如果是,则调用函数定义解析模块进行解析;如果扫描到的是类,则略过类的名字和定义块。第二遍扫描,扫描所有类的定义,发现类的定义并调用类解析模块进行解析。第三遍扫描,发现函数的名字以及定义,并调用函数定义解析模块进行解析。这三遍中用到的解析模块以及进行词法分析的token_get()函数将在后面介绍[7]。
3 Tina解释器的体系结构
Tina解释器的体系结构从主程序模块main.c开始,这个模块包括五个部分,其中构建模块也包括五个部分,函数解析模块包含七部分:词法分析模块,贯穿整个函数解析模块;中间代码执行模块调用函数解析模块、虚拟机运行模块、API解析模块和变量处理模块;变量处理和表达式解析模块会调用词法分析、变量处理、函数解析模块。
3.1 token_get()函数
从当前位置(pos)解析一个词法标记,并将词法标记的相关信息存入t_k所指向的TokenInfo对象里,解析之后,当前位置会向后跳跃一个词法标记,我们假设整个待输入的缓存中的词法是无错的(即不存在无效的词法单元)。
首先,刷新t_k的字符串内容,建立临时储存词法标记字符串的数组并且清零。检测是否已经到了文件尾并且删除前导空白符(回车、换行、空格),检查复合运算符(>=,<=,==,!=, =,-=,*=,/=)、运算符(., ,-,*,/,>,<,=,(,[)、引用标记(