业务规则引擎词法分析

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
资料介绍:
课题研究的目标及意义
随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独立出来做研究的重要性[5]。不过词法分析器的作用却不限于此。我们有时候建立了比较复杂的配置文件,譬如XML的时候,分析器首先也要对该文件进行词法分析,把整个字符串断成了一个一个比较短小的记号[7](指的是具有某种属性的字符串),之后才进行结构上的分析。再者,在实现某种控制台应用程序的时候,程序需要分析用户打进屏幕的命令[6]。如果该命令足够复杂的话,我们也首先要对这个命令进行词法分析,之后得到的结果会大大方便进行接下去的工作[13]。
1.3编译器发展历史及前景
从20世纪50年代早期第一个编译器出现至今,我们所掌握的有关编译器的知识已经得到了长足的发展。我们很难说出第一个编译器出现的准确时间,因为最初的很多实验和实现是由不同的工作小组独立完成的。编译器的早期工作主要集中在如何把算术表达式翻译成机器代码[7] [8]。
整个20世纪50年代,编译器的编写一直被认为是一个极难的问题。比如Fortran的第一个编译器花了18人年才得以实现。目前,我们已经系统地掌握了处理编译期间发生的许多重要任务的技术[9]。良好的实现语言、程序设计环境和软件工具也已经被开发出来。借助于这些先进的技术、环境和工具[10],一个真正的编译器完全可以作为一个课题重点研究,并使其更好地实现[11]。 think58 [来源:http://www.think58.com]
上个世纪60年代,开始了分析问题(parsing problem,用于上下文无关文法识别的有效算法)[17]的研究。现在它已是编译原理中的一个标准部分。有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,并且引出了表示程序设计语言的单词的符号方式[12]。
人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术[10](Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)[10]。
当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器[5](Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex是这其中的佼佼者。[12]
在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化[13],这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。 think58.com
目前,编译系统软件垄断了绝大部分的软件市场。编译程序作为符号处理的工具,其基本原理和技术有着典型性和广泛性,在软件工程、逆向工程、软件再工程、语言转换及其他领域都有着广泛的应用[12]。例如,语法制导的程序编辑软件、程序结构分析软件、程序调试与测试软件、反汇编软件、符号执行软件的开发也有一定的启发和指导作用。编译程序作为符号处理的工具,只要设计符号处理,就需要采用编译程序实现的基本原理有技术[14]。
词法分析器构造实践之必要性
编译原理以形式语言理论相关概念为基础[6],尤其是实现语义分析的语法制导的翻译,以基于形式定义的属性文法[11]为基础,其本身决定了有较强的理论性,但所讨论的编译程序作为高级程序设计语言支持软件,作为符号处理的工具,它又有很强的实践性,因此要兼顾理论性与实践性两方面。
词法分析是编译程序第一阶段的工作。词法分析程序的输入是源程序字符串,输出是等价的内部中间表示——属性字序列,为以后的语法分析奠定基础[11]。因此词法分析是相当重要的,要做好一个编译器首先就得做好词法分析。词法分析的高效率,才能保证整个编译系统的高效率[15]。
3. 业务规则引擎词法分析之过程分析
编译器的扫描或词法分析(lexical analysis)阶段可将源程序读作字符文件并将其分为若干个记号。记号与自然语言中的单词类似:每一个记号都是表示源程序中信息单元的字符序列。典型的有:关键字(keyword),例如if和while,它们是字母的固定串;标识符(identifier)是由用户定义的串,它们通常由字母和数字组成并由一个字母开头;特殊符号(special symbol)如算术符号+和*、一些多字符符号,如>= 和< >。在各种情况中,记号都表示由扫描程序从剩余的输入字符的开头识别或匹配的某种字符格式。 [版权所有:http://think58.com]
由于扫描程序的任务是格式匹配的一种特殊情况,所以需要研究在扫描过程中的格式说明和识别方法,其中最主要的是正则表达式(regular expression)和有穷自动机(finite automata)。但是,扫描程序也是处理源代码输入的编译器部分[17],而且由于这个输入经常需要非常多的额外时间,扫描程序的操作也就必须尽可能地高效了。因此还需十分注意扫描程序结构的实际细节。
扫描程序问题的研究可分为以下几个部分:首先,给出扫描程序操作的一个概貌以及所涉及到的结构和概念。其次是学习正则表达式,它是用于表示构成程序设计语言的词法结构的串格式的标准表示法。接着是有穷状态机器或称有穷自动机,它是对由正则表达式给出的串格式的识别算法。
3.1扫描处理
扫描程序的任务是从源代码中读取字符并形成由编译器的以后部分(通常是分析程序)处理的逻辑单元。由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母构成单词并确定单词的含义很相像。此时它的任务很像拼写。记号通常定义为枚举类型的逻辑项[9]。例如,记号在C中可被定义为:
typedef enum
{IF, THEN, ELS, EPLUS, MINUS, NUM, ID, ...}
Token Type;
记号有若干种类型,这其中包括了保留字(reserved word),如IF和THEN,它们表示字符串“ i f”和“ t h e n”;第2类是特殊符号(special symbol),如算术符号加(PLUS)和减(MINUS),它们表示字符“+”和“-”。第3类是表示多字符串的记号,如NUM和ID,它们分别表示数字和标识符。 think58.com
作为逻辑项的记号必须与它们所表示的字符串完全区分开来。例如:保留字记号IF须与它表示的两个字符“i、f”的串相区别。为了使这个区别更明显,由记号表示的字符串有时称作它的串值(string value)或它的词义(lexeme)。某些记号只有一个词义:保留字就具有这个特性。但记号还可能表示无限多个语义。例如标识符全由单个记号ID表示,然而标识符有许多不同的串值来表示它们的单个名字。因为编译器必须掌握它们在符号表中的情况,所以不能忽略这些名字。因此,扫描程序也需用至少一些记号来构造串值。任何与记号相关的值都是记号的属性(attribute),而串值就是属性的示例。记号还可有其他的属性。例如,NUM记号可有一个诸如“32767”的串值属性,它是由5个数字字符组成,但它还会有一个由其值计算所得的真实值32767组成的数字值属性。在诸如PLUS这样的特殊符号记号中,不仅有串值“+”还有与之相关的真实算术操作+。实际上,记号符号本身就可看作是简单的其他属性,而记号就是它所有属性的总和。
为了后面的处理,扫描程序要求至少具有与记号所需相等的属性。例如要计算NUM记号的串值,但由于从它的串值就可计算,因此也就无需立刻计算它的数字值了。另一方面,如果计算它的数字值,就会丢弃掉它的串值。有时扫描程序本身会完成在恰当位置记录属性所需的操作,或直接将属性传到编译器后面的阶段。例如,扫描程序能利用标识符的串值将其输入到符号表中,或在后面传送它。 [资料来源:http://THINK58.com]
随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独立出来做研究的重要性[5]。不过词法分析器的作用却不限于此。我们有时候建立了比较复杂的配置文件,譬如XML的时候,分析器首先也要对该文件进行词法分析,把整个字符串断成了一个一个比较短小的记号[7](指的是具有某种属性的字符串),之后才进行结构上的分析。再者,在实现某种控制台应用程序的时候,程序需要分析用户打进屏幕的命令[6]。如果该命令足够复杂的话,我们也首先要对这个命令进行词法分析,之后得到的结果会大大方便进行接下去的工作[13]。
1.3编译器发展历史及前景
从20世纪50年代早期第一个编译器出现至今,我们所掌握的有关编译器的知识已经得到了长足的发展。我们很难说出第一个编译器出现的准确时间,因为最初的很多实验和实现是由不同的工作小组独立完成的。编译器的早期工作主要集中在如何把算术表达式翻译成机器代码[7] [8]。
整个20世纪50年代,编译器的编写一直被认为是一个极难的问题。比如Fortran的第一个编译器花了18人年才得以实现。目前,我们已经系统地掌握了处理编译期间发生的许多重要任务的技术[9]。良好的实现语言、程序设计环境和软件工具也已经被开发出来。借助于这些先进的技术、环境和工具[10],一个真正的编译器完全可以作为一个课题重点研究,并使其更好地实现[11]。 think58 [来源:http://www.think58.com]
上个世纪60年代,开始了分析问题(parsing problem,用于上下文无关文法识别的有效算法)[17]的研究。现在它已是编译原理中的一个标准部分。有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,并且引出了表示程序设计语言的单词的符号方式[12]。
人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术[10](Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)[10]。
当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器[5](Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex是这其中的佼佼者。[12]
在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化[13],这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。 think58.com
[资料来源:http://think58.com]
目前,编译系统软件垄断了绝大部分的软件市场。编译程序作为符号处理的工具,其基本原理和技术有着典型性和广泛性,在软件工程、逆向工程、软件再工程、语言转换及其他领域都有着广泛的应用[12]。例如,语法制导的程序编辑软件、程序结构分析软件、程序调试与测试软件、反汇编软件、符号执行软件的开发也有一定的启发和指导作用。编译程序作为符号处理的工具,只要设计符号处理,就需要采用编译程序实现的基本原理有技术[14]。
词法分析器构造实践之必要性
编译原理以形式语言理论相关概念为基础[6],尤其是实现语义分析的语法制导的翻译,以基于形式定义的属性文法[11]为基础,其本身决定了有较强的理论性,但所讨论的编译程序作为高级程序设计语言支持软件,作为符号处理的工具,它又有很强的实践性,因此要兼顾理论性与实践性两方面。
词法分析是编译程序第一阶段的工作。词法分析程序的输入是源程序字符串,输出是等价的内部中间表示——属性字序列,为以后的语法分析奠定基础[11]。因此词法分析是相当重要的,要做好一个编译器首先就得做好词法分析。词法分析的高效率,才能保证整个编译系统的高效率[15]。
3. 业务规则引擎词法分析之过程分析
编译器的扫描或词法分析(lexical analysis)阶段可将源程序读作字符文件并将其分为若干个记号。记号与自然语言中的单词类似:每一个记号都是表示源程序中信息单元的字符序列。典型的有:关键字(keyword),例如if和while,它们是字母的固定串;标识符(identifier)是由用户定义的串,它们通常由字母和数字组成并由一个字母开头;特殊符号(special symbol)如算术符号+和*、一些多字符符号,如>= 和< >。在各种情况中,记号都表示由扫描程序从剩余的输入字符的开头识别或匹配的某种字符格式。 [版权所有:http://think58.com]
由于扫描程序的任务是格式匹配的一种特殊情况,所以需要研究在扫描过程中的格式说明和识别方法,其中最主要的是正则表达式(regular expression)和有穷自动机(finite automata)。但是,扫描程序也是处理源代码输入的编译器部分[17],而且由于这个输入经常需要非常多的额外时间,扫描程序的操作也就必须尽可能地高效了。因此还需十分注意扫描程序结构的实际细节。
扫描程序问题的研究可分为以下几个部分:首先,给出扫描程序操作的一个概貌以及所涉及到的结构和概念。其次是学习正则表达式,它是用于表示构成程序设计语言的词法结构的串格式的标准表示法。接着是有穷状态机器或称有穷自动机,它是对由正则表达式给出的串格式的识别算法。
3.1扫描处理
扫描程序的任务是从源代码中读取字符并形成由编译器的以后部分(通常是分析程序)处理的逻辑单元。由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母构成单词并确定单词的含义很相像。此时它的任务很像拼写。记号通常定义为枚举类型的逻辑项[9]。例如,记号在C中可被定义为:
typedef enum
{IF, THEN, ELS, EPLUS, MINUS, NUM, ID, ...}
Token Type;
记号有若干种类型,这其中包括了保留字(reserved word),如IF和THEN,它们表示字符串“ i f”和“ t h e n”;第2类是特殊符号(special symbol),如算术符号加(PLUS)和减(MINUS),它们表示字符“+”和“-”。第3类是表示多字符串的记号,如NUM和ID,它们分别表示数字和标识符。 think58.com
[版权所有:http://think58.com]
作为逻辑项的记号必须与它们所表示的字符串完全区分开来。例如:保留字记号IF须与它表示的两个字符“i、f”的串相区别。为了使这个区别更明显,由记号表示的字符串有时称作它的串值(string value)或它的词义(lexeme)。某些记号只有一个词义:保留字就具有这个特性。但记号还可能表示无限多个语义。例如标识符全由单个记号ID表示,然而标识符有许多不同的串值来表示它们的单个名字。因为编译器必须掌握它们在符号表中的情况,所以不能忽略这些名字。因此,扫描程序也需用至少一些记号来构造串值。任何与记号相关的值都是记号的属性(attribute),而串值就是属性的示例。记号还可有其他的属性。例如,NUM记号可有一个诸如“32767”的串值属性,它是由5个数字字符组成,但它还会有一个由其值计算所得的真实值32767组成的数字值属性。在诸如PLUS这样的特殊符号记号中,不仅有串值“+”还有与之相关的真实算术操作+。实际上,记号符号本身就可看作是简单的其他属性,而记号就是它所有属性的总和。
为了后面的处理,扫描程序要求至少具有与记号所需相等的属性。例如要计算NUM记号的串值,但由于从它的串值就可计算,因此也就无需立刻计算它的数字值了。另一方面,如果计算它的数字值,就会丢弃掉它的串值。有时扫描程序本身会完成在恰当位置记录属性所需的操作,或直接将属性传到编译器后面的阶段。例如,扫描程序能利用标识符的串值将其输入到符号表中,或在后面传送它。 [资料来源:http://THINK58.com]