JFLEX词法分析
安装与配置
1.下载jflex-1.4.3.zip,解压缩到本地目录(c:/jflex)。
2.到jflex\bin\jflex.bat文件,配置JAVA HOME和JFLEX HOME
3.把x:\jflex\bin写入系统环境变量path中
运行
可视化方式
直接运行jflex\bin\jflex.bat文件,打开可视化界面操作即可。
命令行方式
配置
把x:\jflex\bin以及x:\jflex\lib\ JFlex.jar配置到系统环境变量的CLASSPATH中。
格式
java JFlex.Main <options> <inputfiles>
运行参数
-d <directory>
<directory>生成文件的输出目录
--skel <file>
使用外部的骨架文件生成扫描器类,它大多数情况下用于JFLEX的维护和低级别定制。只有
在你知道自己正在作什么时候才使用它。JFLEX的源码中带有一个骨架文件,预先编写骨架文件才能使用此命令。
--nomin
在扫描器生成的过程中,跳过DFA简化步骤。
--jlex
完全兼容jlex
--dot
为NFA, DFA and minimised DFA生成扩展名为.dot的graphviz图型文件。该参数还在最初阶段,尚未完全实现。
--dump
在控制台显示NFA转换表,初始DFA和最简DFA。
--verbose or –v
显示生成过程信息。
--quiet or –q
仅显示生成错误信息
--time
显示代码生成耗时信息(不十分精确)
--version字符串常量中不能直接包括双引号和反斜杠符号
打印JFLex版本号
--info
打印系统以及JDK信息。
--pack
使用%pack代码生成策略
--table
使用%table代码生成策略
--switch
使用%switch代码生成策略
--help or -h
打印帮助信息,解释运行参数以及Jflex用法。
JFLEX 配置文件编写
配置文件以.flex为扩展名,整个文档分为三个部分,使用%%划分
1.用户代码
2.选项与声明
3.词法规则
形式形如:
用户代码
JFLEX直接将这部分代码拷贝到生成词法分析器Java源文件中,通常在这里我们只定义一些类注释信息以及package和import的引用。
选项与声明
在这一部分,选项用来定制词法分析器,声明则是声明一些能够在第三部分(词法规则定义)使用的宏定义和词法状态,其中宏大多由正则表达式定义。
选项
所有选项都要由一个“%”符号开头,下面来列举一下所有的选项:
类选项和用户代码
%class
定义生成词法分析器Java文件的文件名,如果不定义该选项,则默认生成”Yylex.java”。例子:%class MyScanner
%implements
使得生成的词法分析器类实现特定的接口,可以同时实现多个接口。
例子:%implements interface1,interface2
%extends
使得生成的词法分析器类是某个类的子类,至多定义一个%extends选项。
例子:%extends ParentClass
%public
使得生成的类是public的,类似的还有%final和%abstract指令,他们分别生成的类是final 和abstract类型的。
例子:%public
%apiprivate
使得生成的类文件中,所有生成的方法和变量都变为private,只有该类的构造方法和用户自定代码段除外。如果使用了%cup选项,那么next_token方法也不会被设定为私有。这个方法如果没有特殊情况不推荐使用。
例子:% apiprivate
%{………用户代码…….%} 类代码指令
其中用户代码将被直接复制到生成类文件中,在这里你可以定义自己的成员变量和方法。此规范描述中出现多个类代码指令,那么JFLEX将根据这些类代码指令出现的先后顺序将他们拼接起来。
例子:
%{
public String name;
public void test(){
System.out.println(“this is a test!”);
}
………………
………………
%}
%init{………初始化代码………%init}
初始化代码将被直接复制生成类的构造函数中,我们可以在这里对类指令代码中声明的成员变量进行初始化工作。同类代码指令一样,如果出现多个初始化指令定义,那么JFLEX将根据这些类代码指令出现的先后顺序将他们拼接起来。
例子:
%init{
name=”Benson”;
………………
………………
%init}
%initthrow
使得生成的类的构造器方法抛出某种异常,也就说当我们实例化生成的词法分析器时需要捕获异常才可以。
例子:
方式1:
%initthrow{
"exception1","exception2"
%initthrow}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论