`
abruzzi
  • 浏览: 452778 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

脚本引擎的设计与实现(javacc) [一]

阅读更多

 

打算写一个系列,比较系统的介绍一下一个脚本引擎的设计和实现过程,本来打算使用lex/yacc来举例子,但是由于最近对java语言有了新的认识,故决定使用javacc这个工具来做,这个系列中就是以javacc中的一个比较复杂的例子来进行解说的。

这篇文章是本系列的第一篇,主要说几个概念的定义,有了这些定义,后边就容易理解了。

对一个语言的源文件进行解析,主要是做这样几件事:

  1. 词法分析
  2. 语法分析
  3. 语义分析

当然,每个步骤中都有自己的错误检查机制,这里暂且不表。下边分别对这几个过程进行解说:

词法分析

词法分析过程中,读入的是一个个的字符,返回的是记号(token).记号是语法分析所认识的一种抽象的概念。
语言中的关键字,变量名,数字,操作符,串等都是记号。

int x;
= 0;

上边这些代码,被词法分析器分析之后,应该生成这样的记号:

<int>,空格,<x>,分号,回车换行,<x>,<=>,<0>,分号

一般而言,在这个过程中,空白字符(空格,tab)都应该被跳过。

词法分析中会用到大量的正则表达式,因为正则表达式的表达能力是非常强大的。在此略微举几个例子,如对数字,变量名的定义,用正则表达式表示如下:

 

NUMBER ::= [0-9][0-9]*
VAR ::
= [a-zA-Z_][a-zA-Z0-9_]*

方括号"[]"表示一个区间,取这个区间中的任意一个字符,"*"表示零次或多次匹配,连字符"-"表示连接此连字符前后的一个区间,如0-9表示从0到9的任意一个字符。所以,NUMBER记号的正则表达式正好可以表示,以0-9中任意一个字符开头,后边跟任意多个0-9之间的数字(含0和9).而VAR的定义正如大部分语言要求的那样,以字母或者下划线开始,后边是任意多个字母或者数字或者下划线。如果需要限定VAR的长度为32位,则可以修改成这样:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->VAR ::= [a-zA-Z_][a-zA-Z0-9_]*{31}

语法分析

语法分析过程中,读入的是词法分析器返回的记号,返回的是规则(rule),这些规则是语义分析所需要的,在语法分析中,一般会使用BNF来表示规则,比如赋值语句是一个合法的语句,则在此处需要定义关于语法的BNF:

 

assignment ::= INT VAR EQ NUMBER END
INT ::
= "int"
VAR ::
= [a-zA-Z_][a-zA-Z0-9_]*
EQ 
= "="
NUMBER ::
= [0-9][0-9]*
END ::= ";"

就是说,如果读入了这样一个记号的序列:INT VAR EQ NUMBER END,则这个序列被识别成一个赋值的语句,但是,这个还是一个简单的规则,对于这个语句的意思还是不明确的,也就是说,虽然它可以认识所有的赋值语句,但是没有意义,意义的定义在语义分析部分。

 

BNF的表达能力也是非常强大的,比如一个四则混合语算的BNF可以定义如下:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->expr ::= term ((+|-) term)*  
term ::
= factor ((*|/) factor)*  
factor ::
= number | expr   
number ::
= [0-9]+

这个BNF可以支持乘除运算优先级高于加减法运算,括号优先级高于乘除法,且可以支持对四则混合运算的任意层次的扩展,比如:

 

( ( 12 + 3 ) / 6 ) + ( 1/5 + 155 ) 等的正确解析。

语义分析

在语义分析中,我们需要对在语法分析过程中得出的规则进行解释,比如赋值语句,我们需要将起翻译成:将NUMBER这个记号中的‘值’赋给名叫VAR的一个INT型变量。这个过程完成实际的语法解析,使得语言本身对外有意义。语义分析是脚本型的语言的最高级形式,即脚本解析到此为止将被转换成实际的语言内容并交付给宿主语言编译器进行编译并执行。又或者语义分析发现了一个语法分析过程中规约出来的四则运算表达式,那么它会根据语法中的规则对这个表达式进行求值,计算出最终结果来。

在这个系列中我们用到的一个语言叫做SPL(Stupid Programming Language),这是javacc中给它起的名字,我们不妨将其改名为SPL(Simple Programming Language),呵呵。

关于概念就解释到这里,如果你对正则表达式,BNF等概念不是很熟悉,可以先找找资料来学习。好了,第一篇先介绍这么多吧,后边再续。

 

分享到:
评论

相关推荐

    CMM语言解释器JAVA实现(javacc5.0)增强版

    6. **解释器的设计与实现**:CMM语言解释器的实现可能包括以下几个关键部分: - **词法分析**:将输入的字符流转换为有意义的符号或标记(tokens)。 - **语法分析**:使用这些标记构建抽象语法树(AST),这是一...

    CMM语言解释器JAVA实现(javacc5.0)

    总的来说,"CMM语言解释器JAVA实现(javacc5.0)"项目是一个典型的编译原理实践,它涉及到语言设计、解析技术以及程序执行等多个方面的知识。通过这个项目,开发者可以深入理解编程语言的底层工作原理,同时也能提升...

    JavaCC实现MiniC语言的编译

    在本项目中,"JavaCC实现MiniC语言的编译"是一个实践性的任务,目的是利用JavaCC来构建一个小型的C语言编译器——MiniC。这个编译器能够解析、理解和转换C语言的基本元素,如变量声明、表达式、控制结构等。 1. **...

    javacc-5.0.zipjavacc-5.0.zip

    JavaCC(Java Compiler Compiler)是一款强大的词法分析和语法分析工具,主要用于生成Java语言的解析器和词法分析器。这个“javacc-5.0.zip”文件包含了JavaCC的5.0版本,是一个用于处理源代码和其他形式的文本输入...

    基于JavaCC的c语言编译器前端实现

    这个项目“基于JavaCC的C语言编译器前端实现”显然旨在教授如何使用JavaCC来创建一个C语言的编译器前端。 在编译器设计中,前端主要负责词法分析、语法分析和语义分析。词法分析是将源代码转换为一系列的单词项...

    javaCC入门文档

    JavaCC(Java Compiler Compiler)是一款用于构建解析器的工具,尤其适用于那些希望开发编译器、解释器或脚本引擎的程序员。通过JavaCC,用户可以轻松地实现语法分析和词法分析功能,并能自动生成相应的Java代码。 ...

    基于JavaCC的SQL编译器的设计与实现.pdf

    EBNF能够清晰地表达复杂的语法结构,并通过一系列的规则来描述语言的语法元素及其相互关系,这在SQL编译器的设计和实现中显得尤为重要。 通过EBNF,SQL编译器的设计者可以将复杂的SQL语法分解成一组简单的规则,...

    JavaCC学习与应用

    ### JavaCC 学习与应用知识点详解 #### 一、JavaCC 概述 - **定义**:JavaCC(Java Compiler Compiler)是一款用于Java开发的语法分析生成器工具,能够根据给定的文法文件自动生成Java代码,这些Java代码能够解析...

    javacc 词法分析器

    总之,JavaCC是一个强大的工具,用于生成词法分析器和解析器,它支持面向对象的编程,并允许开发者专注于语言文法的定义,而不是底层解析算法的实现。在给定的项目中,`testcc`目录的代码可能包含了一些使用JavaCC...

    javacc安装包javacompilercompiler

    2. `javacc.exe`/`javacc.sh`:Windows和Unix/Linux下的命令行执行脚本,用于运行JavaCC工具。 3. `lib`目录:可能包含JavaCC运行所需的其他依赖库。 4. `docs`目录:可能包含JavaCC的用户手册、API文档或其他帮助...

    JavaCC

    JavaCC,全称为Java Compiler Compiler,是一款强大的工具,主要用于生成解析器和词法分析器,尤其是在处理复杂的语法和解析任务时。它是一个基于Java的开源软件,被广泛应用于构建编译器、解释器以及各种语言处理...

    基于JavaCC的C代码自动并行化的设计与实现

    基于JavaCC的C代码自动并行化设计与实现是一个旨在优化C语言程序性能的项目,通过分析C源代码并进行智能转化,将原本串行的执行流程转化为可以并行处理的部分。 JavaCC(Java Compiler Compiler)是一个广泛使用的...

    javacc实现cmm语法分析

    JavaCC(Java Compiler Compiler)是一种广泛使用的工具,用于生成解析器和词法分析器,尤其在处理复杂的语法和解析任务时。在这个特定的场景中,我们关注的是如何使用JavaCC来实现CMM(可能是“计算机动画建模语言...

    用JavaCC构造编译器的方法

    这一过程极大地简化了编译器的设计与实现流程,使得开发者可以专注于语言特性的定义,而不是具体的实现细节。 - **词法分析器**:负责将源代码分解成一系列有意义的词汇单元,如关键字、标识符、常量等。 - **语法...

    javacc构造编译器的方法

    例如,在设计一个美化源代码打印工具、自动插入调试输出信息的程序或者是自定义脚本语言时,都需要涉及到编译器的设计与实现。本文首先简要介绍了语法分析器自动生成的原理,并重点介绍了一个由Sun公司开发的编译器...

    Test.rar 使用Javacc编写的简易计算器

    JavaCC,全称为Java Compiler Compiler,是一款强大的解析器生成器,用于构建语法分析器和词法分析器。它根据用户定义的语法规则生成Java源代码,这些源代码可以读取、解析符合规则的输入,比如编程语言、数学表达式...

    javacc.zip

    JavaCC(Java Compiler Compiler)是一种强大的词法分析器和语法分析器生成器,它允许开发者定义自己的编程语言或解析复杂的输入格式。这个“javacc.zip”文件包含了JavaCC的7.0.5版本,该版本可能针对原始仓库进行...

    基于JavaCC的Python编译器的设计与实现+全部资料齐全+部署文档 优秀项目

    基于JavaCC的Python编译器,实现了Python的一些基本语法从词法分析、语法分析和语义分析三方面进行编译器的设计与实现实现了以Java为语言,以JavaCC为编译器自动生成工具,语法模仿Python的编译器+全部资料齐全+部署...

Global site tag (gtag.js) - Google Analytics