一种嵌入式编译体系扫描器的实现方法

文档序号:6556600阅读:135来源:国知局
专利名称:一种嵌入式编译体系扫描器的实现方法
技术领域
本发明涉及嵌入式系统编译技术领域,特别是涉及一种嵌入式编译体系扫描器的实现方法。
背景技术
编译器是将一种语言翻译为另一种语言的计算机程序。编译器将源程序(source language)编写的程序作为输入,而产生用目标语言(targetlanguage)编写的等价程序。通常地,源程序为高级语言(high-levellanguage),如C或C++,而目标语言则是目标机器的目标代码(object code,有时也称作机器代码(machine code),也就是写在计算机机器指令中的用于运行的代码。
编译器是一种相当复杂的程序,其代码的长度可从10 000行到1 000 000行不等。编写甚至读懂这样的一个程序都非易事,大多数的计算机科学家和专业人员也从来没有编写过一个完整的编译器。但是,几乎所有形式的计算均要用到编译器,而且任何一个与计算机打交道的专业人员都应掌握编译器的基本结构和操作。除此之外,计算机应用程序中经常遇到的一个任务就是命令解释程序和界面程序的开发,这比编译器要小,但使用的却是相同的技术。因此,掌握这一技术具有非常大的实际意义。
编译器设计最近的发展包括首先,编译器包括了更为复杂的算法的应用程序,它用于推断和/或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(interactive development environment,IDE)的一部分,它包括了编辑器、链接程序、调试程序以及项目管理程序。这样IDE的标准并没有多少,但是已沿着这一方向对标准的窗口环境进行开发了。尽管近年来对此进行了大量的研究,但是基本的编译器设计在近20年中都没有多大的改变,而且它们正迅速地成为计算机科学课程中的中心一环。

发明内容
本发明的目的在于克服现有技术的不足,提供一种嵌入式编译体系扫描器的实现方法。本发明解决其技术问题采用的技术方案如下本发明提供了一种嵌入式编译体系扫描器的实现方法,其特征在于,包括以下步骤1)读入程序文件内容扫描器程序根据编译要求打开编译对象程序文件,并将文件内容作为字符读入,由扫描器程序生成的逻辑单元,称作记号token;2)生成正则表达式扫描器程序按照正则表达式规则的要求,将步骤(1)中生成记号转化为正则表达式r;所述正则表达式r表示字符串的格式,完全由它所匹配的串集来定义,写作L(r);3)构造有穷自动机扫描器程序按照有穷自动机的构造要求,将步骤(2)中生成的正则表达式转化为有穷自动机;其实现方式为确定性有穷自动机DFA,M由字母表∑、状态集合S、转换函数TS×∑→S、初始状态S0∈S以及接受状态的集合AS组成,由M接受的且写作L(M)被定义为字符c1c2...cn串的集合,其中每个ci∈∑,存在状态s1=T(s0,c1),s2=T(s1,c2),...,sn=T(sn-1,cn),其中sn是A即一个接受状态的一个元素;4)词法分析结果记录将步骤(3)中生成的有穷自动机翻译成程序,记录到文件中,作为词法分析的结果输出。
作为本发明的一种改进,步骤(1)中所述扫描程序生成的逻辑单元记号token定义为枚举类型的逻辑项,包括了保留字reserved word、特殊符号special symbol。
本发明与背景技术相比,具有的有益的效果是将源程序读作字符文件并将其分为若干个记号。记号与自然语言中的单词类似,每一个记号都是表示源程序中信息单元的字符序列。在各种情况中,记号都表示由扫描程序从剩余的输入字符的开头识别或匹配的某种字符格式。本发明的方法可以从源代码中读取字符并形成由编译器的以后部分,通常是分析程序处理的逻辑单元,有效的为编译体系提供词法分析支持。


图1是本发明过程的示意图;图2是示例中有穷自动机构造示意图;图3是示例中有穷自动机选择示意图;图4是示例中有穷自动机重复示意图;图5是示例中有穷自动机并置示意图。
具体实施例方式
下面结合附图对本发明作进一步的说明。
一种嵌入式编译体系扫描器的实现方法,附图1是本发明实施过程的整体示意图,其具体实施方法如下1)读入程序根据编译要求,打开编译对象文件,并将文件内容作为字符读入,由扫描程序生成的逻辑单元称作记号token,将字符组合成记号与在一个英语句子中将字母构成单词并确定单词的含义很相像,记号通常定义为枚举类型的逻辑项,记号有若干种类型,这其中包括了保留字reserved word,特殊符号specialsymbol,表示多字符串的记号;例如,记号在C中可被定义为typedef enum
{IF,THEN,ELS,EPLUS,MINUS,NUM,ID,...}Token Type;作为逻辑项的记号必须与它们所表示的字符串完全区分开来。例如保留字记号IF须与它表示的两个字符“if”的串相区别。为了使这个区别更明显,由记号表示的字符串有时称作它的串值(string value)或它的词义(lexeme)。某些记号只有一个词义保留字就具有这个特性。但记号还可能表示无限多个语义。例如标识符全由单个记号ID表示,然而标识符有许多不同的串值来表示它们的单个名字。因为编译器必须掌握它们在符号表中的情况,所以不能忽略这些名字。因此,扫描器也需用至少一些记号来构造串值。任何与记号相关的值都是记号的属性(attribute),而串值就是属性的示例。记号还可有其他的属性。例如,NUM记号可有一个诸如“32767”的串值属性,它是由5个数字字符组成,但它还会有一个由其值计算所得的真实值32767组成的数字值属性。在诸如PLUS这样的特殊符号记号中,不仅有串值“+”还有与之相关的真实算术操作+。实际上,记号符号本身就可看作是简单的其他属性,而记号就是它所有属性的总和。
2)生成正则表达式正则表达式表示字符串的格式。正则表达式r完全由它所匹配的串集来定义,这个集合称为由正则表达式生成的语言language generated by theregular expression,写作L(r),扫描器按照正则表达式规则的要求,将1)中生成记号转化为正则表达式;实际识别I、数。数可以仅是数字(自然数)、十进制数、或带有指数的数(由e或E表示)的序列。例如2.71E-2表示数.0271。可用正则定义将这些数表示如下nat=
+signedNat=(+|-)?natnumber=signedNat(″.″nat)?(Esigned Nat)?此处,在引号中用了一个十进制的点来强调它应直接匹配且不可被解释为一个元字符。
II、保留字和标识符。正则表达式中最简单的就是保留字了,它们由字符的固定序列表示。如果要将所有的保留字收集到一个定义中,就可写成reserved=if|while|do|...
相反地,标识符是不固定的字符串。通常,标识符必须由一个字母开头且只包含字母和数字。可用以下的正则定义表示letter=[a-zA-Z]digit=
identifier=letter(letter|digit)*III、注释。注释在扫描过程中一般是被忽略的。然而扫描程序必须识别注释并舍弃它们。因此尽管扫描程序可能没有清晰的常量记号(可将其称为“伪记号pseudotoken”),仍需要给注释编写出正则表达式。注释可有若干个不同的格式。通常,它们可以是前后为分隔符的自由格式,例如{this is a Pascal comment}/*this is a C comment*/或由一个或多个特殊字符开头并直到该行的结尾,如在;this is a Scheme comment--this is an Ada comment中。
为有单个字符的分隔符的注释(如Pascal注释)编写正则表达式并不难,且为那些从行的特殊字符到行尾编写正则表达式也不难。例如Pascal注释可写作{(~})*}其中,用~}表示“非}”,并假设字符}作为元字符没有意义。
IV、二义性、空白格和先行在程序设计语言记号使用正则表达式的描述中,有一些串经常可被不同的正则表达式匹配。例如诸如if和while的串可以既是标识符又可以是关键字。类似地,串<>可解释为表示两个记号(“小于号”和“大于号”)或一单个符号(“不等于”)。程序设计语言定义必须规定出应遵守哪个解释,但正则表达式本身却无法做到它。相反地,语言定义必须给出无二义性规则(disambiguating rules),由其回答每一种情况下的含义。
3)构造有穷自动机确定性有穷自动机D FA,M由字母表∑、状态集合S、转换函数TS×∑→S、初始状态S0∈S以及接受状态的集合AS组成,由M接受的且写作L(M)被定义为字符c1c2...cn串的集合,其中每个ci∈∑,存在状态s1=T(s0,c1),s2=T(s1,c2),...,sn=T(sn-1,cn),其中sn是A(即一个接受状态)的一个元素,扫描器按照有穷自动机的构造要求,主要采用基本正则表达式的转换,并置,选择,重复的方法,将2)中生成的正则表达式转化为有穷自动机;如将正则表达式letter(letter|digit)*翻译为有穷自动机首先分别为正则表达式letter和digit构建机器,如图2;接着再为选择letter|digit构造机器,如图3;现在为重复(letter|digit)*构造自动机,如图4;最后,将letter和(letter|digit)*并置在一起,并构造该并置的机器以得到完整的有穷自动机,如图54)词法分析结果记录将3)中生成的有穷自动机翻译成程序,记录到文件中,作为词法分析的结果输出。
权利要求
1.一种嵌入式编译体系扫描器的实现方法,其特征在于,包括以下步骤1)读入程序文件内容扫描器程序根据编译要求打开编译对象程序文件,并将文件内容作为字符读入,由扫描器程序生成的逻辑单元,称作记号token;2)生成正则表达式扫描器程序按照正则表达式规则的要求,将步骤(1)中生成记号转化为正则表达式r;所述正则表达式r表示字符串的格式,完全由它所匹配的串集来定义,写作L(r);3)构造有穷自动机扫描器程序按照有穷自动机的构造要求,将步骤(2)中生成的正则表达式转化为有穷自动机;其实现方式为确定性有穷自动机DFA,M由字母表∑、状态集合S、转换函数TS×∑→S、初始状态S0∈S以及接受状态的集合AS组成,由M接受的且写作L(M)被定义为字符c1c2...cn串的集合,其中每个ci∈∑,存在状态s1=T(s0,c1),s2=T(s1,c2),...,sn=T(sn-1,cn),其中sn是A即一个接受状态的一个元素;4)词法分析结果记录将步骤(3)中生成的有穷自动机翻译成程序,记录到文件中,作为词法分析的结果输出。
2.根据权利要求1所述的嵌入式编译体系扫描器的实现方法,其特征在于,步骤(1)中所述扫描程序生成的逻辑单元记号token定义为枚举类型的逻辑项,包括了保留字reserved word、特殊符号special symbol。
全文摘要
本发明涉及嵌入式系统编译技术领域,旨在提供一种嵌入式编译体系扫描器的实现方法。该方法包括读入程序文件内容、生成正则表达式、构造有穷自动机和词法分析结果记录。该方法将源程序读作字符文件并将其分为若干个记号。记号与自然语言中的单词类似,每一个记号都是表示源程序中信息单元的字符序列。在各种情况中,记号都表示由扫描程序从剩余的输入字符的开头识别或匹配的某种字符格式。本发明的方法可以从源代码中读取字符并形成由编译器的以后部分,通常是分析程序处理的逻辑单元,有效的为编译体系提供词法分析支持。
文档编号G06F9/45GK1877531SQ200610052230
公开日2006年12月13日 申请日期2006年6月30日 优先权日2006年6月30日
发明者陈天洲, 赵懿, 王祥生, 沙峰 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1