jflex解析 java_使用 JFlex 生成词法分析器的安装配置及简单示例

本文介绍了在Windows 10上安装配置JFlex的步骤,包括下载解压JFlex,修改jflex.bat文件,设置环境变量,并通过运行jflex --version验证配置。此外,还展示了如何运行JFlex的简单示例,编写lexical specification,生成词法分析器Lexer.java。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Windows 10

STEP 1: 下载 JFlex 文件,我选择的是 jflex-1.7.0.zip。下载完成后解压到想安装的位置。

文件结构如下(假设解压目录为 C:\):

C:\jflex-1.7.0\

+--bin\ (start scripts)

+--doc\ (FAQ and manual)

+--examples\

+--byaccj\ (calculator example for BYacc/J)

+--cup-maven\ (calculator example for cup and maven)

+--interpreter\ (interpreter example for cup)

+--java\ (Java lexer specification)

+--simple-maven\ (example scanner built with maven)

+--standalone-maven\ (a simple standalone scanner,

built with maven)

+--zero-reader\ (Readers that return 0 characters)

+--lib\ (precompiled classes)

+--src\

+--main\

+--config\ (PMD source analyzer configuration)

+--cup\ (JFlex parser spec)

+--java\

+--jflex\ (source code of JFlex)

+--anttask\ (source code of JFlex Ant Task)

+--gui\ (source code of JFlex UI classes)

+--unicode\ (source code for Unicode properties)

+--jflex\ (JFlex scanner spec)

+--resources\ (messages and default skeleton file)

+--test\ (unit tests)

STEP 2:修改 jflex.bat

1)进入 jflex解压目录/jflex-1.7.0/bin,打开jflex.bat

2)修改两个环境变量:

JAVA_HOME :Java JDK 的安装路径

JFLEX_HOME :JFlex 的安装路径

**由于直接打开 jflex.bat 会闪退,我是在 gitbash 中用 nano 编辑的。

a21ab3e9ea69b8e35144ceccb21cc510.png

STEP 3:将 jflex解压目录/jflex-1.7.0/bin 加入系统环境变量 Path

STEP 4:运行 jflex 检查是否配置成功(依旧用的是 gitbash)

文档说,命令格式为jflex  (如果不在命令行输入文件名,jflex会有一个弹出一个输入文件名的窗口)

这里是所有选项的说明:

-d     在指定目录生成文件

--encoding     使用格式的编码读入此法规范并书写 java 文件

--skel     使用外部骨架

--nomin    在扫描生成时跳过 DFA 最小化的步骤

--jflex    执行 JLex 解释规范

--dot    为 NFA, DFA, minimised DFA 生成 Graphviz dot 文件

--dump    显示 NFA, initial DFA, minimised DFA 的转换表

--legacydot    元字符 dot (.) 匹配 [^\n] 而非 [^\n\r\u000B\u000C\u0085\u2028\u2029]

--verbose or -v    显示生成进度消息(默认开启)

--quiet or -q    只显示错误信息

--warn-unused    警告未使用的宏(在 verbose 模式中默认开启,quiet 模式中默认关闭)

--no-warn-unused    不警告未使用的宏

--time     显示代码生成进度的时间信息

--version    打印版本信息

--info    打印系统与 jdk 信息

--unicodever     打印所有 Unicode 版本支持的属性

--help or -h     打印帮助信息

按照习俗,跑跑看 jflex --version:

f6d463270de1146b303af4f26bfcacc4.png

GOOD JOB!

接下来运行一个手册提供的简单例子

这段 lexical specitication 描述了 Java 语言的部分规则,从手册复制下来的时候每行会多出四个空格,要手动去掉。保存在 test.flex 文件中。

%%

%class Lexer

%unicode

%cup

%line

%column

%{

StringBuffer string = new StringBuffer();

private Symbol symbol(int type) {

return new Symbol(type, yyline, yycolumn);

}

private Symbol symbol(int type, Object value) {

return new Symbol(type, yyline, yycolumn, value);

}

%}

LineTerminator = \r|\n|\r\n

InputCharacter = [^\r\n]

WhiteSpace = {LineTerminator} | [ \t\f]

/* comments */

Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}

TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"

// Comment can be the last line of the file, without line terminator.

EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?

DocumentationComment = "/**" {CommentContent} "*"+ "/"

CommentContent = ( [^*] | \*+ [^/*] )*

Identifier = [:jletter:] [:jletterdigit:]*

DecIntegerLiteral = 0 | [1-9][0-9]*

%state STRING

%%

/* keywords */

"abstract" { return symbol(sym.ABSTRACT); }

"boolean" { return symbol(sym.BOOLEAN); }

"break" { return symbol(sym.BREAK); }

{

/* identifiers */

{Identifier} { return symbol(sym.IDENTIFIER); }

/* literals */

{DecIntegerLiteral} { return symbol(sym.INTEGER_LITERAL); }

\" { string.setLength(0); yybegin(STRING); }

/* operators */

"=" { return symbol(sym.EQ); }

"==" { return symbol(sym.EQEQ); }

"+" { return symbol(sym.PLUS); }

/* comments */

{Comment} { /* ignore */ }

/* whitespace */

{WhiteSpace} { /* ignore */ }

}

{

\" { yybegin(YYINITIAL);

return symbol(sym.STRING_LITERAL,

string.toString()); }

[^\n\r\"\\]+ { string.append( yytext() ); }

\\t { string.append('\t'); }

\\n { string.append('\n'); }

\\r { string.append('\r'); }

\\\" { string.append('\"'); }

\\ { string.append('\\'); }

}

/* error fallback */

[^] { throw new Error("Illegal character

yytext()+">"); }

执行命令jflex ,会弹出如下窗口,选择文件和目录,点击 Generate 即可生成 scanner,是一个叫 Lexer.java 的文件。

830a1dddbc950f8f3ce4269d18ba2c30.png

参考:http://www.jflex.de/manual.html#content(官方文档)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值