认识JFlex

ĴFlex is a scanner generator for Java. A scanner generator will generate a scanner (a.k.a. lexer) for you instead of you having to write one yourself. JFlex is modeled after (f)lex only it’s written in Java and generates Java lexers unlike the two older tools.

什么是JFlex工作流程?

  • 创建一个JFlex源文件(* .flex)使用JFlex命令行工具将文件编译为Java文件使用javac编译Java文件调用* .class文件

等,您的扫描仪/词典器正常工作。 您可以将其用作独立工具,也可以与其他程序组合使用-Yacc / Bison之类的工具通常希望扫描仪将其输入作为输入。

JFlex源文件由三部分组成:

以双百分号(%%)分隔。 这是一个简单的示例:

import java.io.\*;

%%

就是第一部分。 奇怪的是,如果要将代码添加到生成的Java类中,则必须将该代码包括在JFlex文件的中间部分(选项和声明)。 这没有什么魔力:JFlex基于模板创建词法分析器,并且您在第一部分中放入的代码最终不会成为所生成类的一部分-这就是为什么将import语句放在此处的原因(可以疯狂使用) 并在其中放置完整的Java类,但这不是一个好主意)。

另一方面,您放置在JFlex文件中间部分的代码确实会成为词法分析器的一部分。 让我们将main方法添加到类中并使其独立:

%{

public static void main(String[] args) throws IOException
{
 InputStreamReader reader =
 new InputStreamReader(System.in);

Lexer lexer = new Lexer(reader);

 System.out.println("Start lexing");

 while (true)
 {
 System.out.println(lexer.yylex());
 }
}

%}

JFlex生成的词法分析器需要使用Java Reader进行初始化。 在这种情况下,我们将接受来自System.in的输入,即。 stdio。 JFlex生成一个名为Yylex的类以及一个名为yylex()的函数。 让我们进行更改(我们仍在JFlex文件的中间部分):

%class Lexer
%type String

%%

这将使JFlex将类名更改为Lexer,并且yylex()将返回Java字符串而不是Yytoken-这是我们不会费力创建的类。

这里的计划是使yylex()返回我们在键盘上键入的任何字符character-这就是为什么我们将其%type指定为String的原因。 然后,我们将使用无限循环(while(true))接受字符并立即将其打印出来。

让我们结束第三部分(词法规则):

[^] { return yytext(); }

[]将匹配任何字符。 yytext()将以字符串形式返回字符,而{return ...}是yylex()将返回的内容,因此我们完成了。

这是完整的文件:

import java.io.\*;

%%

%{

public static void main(String[] args) throws IOException
{
 InputStreamReader reader =
 new InputStreamReader(System.in);

Lexer lexer = new Lexer(reader);

 System.out.println("Start lexing");

 while (true)
 {
 System.out.println(lexer.yylex());
 }
}

%}

%class Lexer
%type String

%%

[^] { return yytext(); }

您需要对其进行编译(在输出中观察jflex错误消息):

[johnny@test example1]$ jflex Lexer.flex

编译生成的Java文件:

[johnny@test example1]$ javac Lexer.java

并运行它:

[johnny@test example1]$ java Lexer

这是一个示例终端会话:

Start lexing
123
1
2
3

abc 
a
b
c

^C[johnny@test example1]$

使用ctrl-c停止程序。 当然,这不是很令人兴奋,您不必使用570 loc Java文件(是的,这就是生成的词法分析器的时间)来回显字符。

You can download the source code from Github.

from: https://dev.to//vicentemaldonado/meet-jflex-59gd

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JFlex是一个用Java编写的词法分析器生成器,可以根据正则表达式生成词法分析器。以下是一个简单的JFlex教程。 1. 安装JFlex 首先,需要从JFlex官网下载JFlex的安装包,并解压到本地目录中。 2. 创建JFlex规则文件 接下来,需要创建一个JFlex规则文件,该文件包含了词法分析器所需的正则表达式和Java代码。以下是一个简单的JFlex规则文件示例: ``` %{ // Java代码,放在这里 %} // 定义正则表达式 %public %class Lexer %unicode %type int // 定义词法规则 %% "hello" { return 1; } [0-9]+ { return 2; } . { return 3; } %% // Java代码,放在这里 ``` 在上面的示例中,`%{}` 和 `%}` 之间的代码是Java代码,可以在其中定义变量和方法等。 `%public` 表示生成的词法分析器类是公共的。 `%class` 定义了生成的词法分析器类的名称。 `%unicode` 表示使用Unicode字符集。 `%type` 表示生成的词法分析器返回的类型。 在 `%%` 之间定义词法规则,每个规则由一个正则表达式和对应的Java代码组成。在上面的示例中,第一个规则匹配字符串 "hello",返回值为1;第二个规则匹配一个或多个数字(0-9),返回值为2;第三个规则匹配任意字符,返回值为3。 3. 生成词法分析器 生成词法分析器的命令为: ``` java -jar jflex-1.8.2.jar Lexer.flex ``` 其中 `jflex-1.8.2.jar` 是JFlex的JAR包,`Lexer.flex` 是上面定义的JFlex规则文件。 执行该命令后,会生成一个名为 `Lexer.java` 的词法分析器类。 4. 使用词法分析器 使用词法分析器的代码示例: ``` import java.io.*; public class Main { public static void main(String[] args) throws IOException { Lexer lexer = new Lexer(new FileReader("input.txt")); int token; while ((token = lexer.yylex()) != -1) { System.out.println("Token: " + token); } } } ``` 在上面的示例中,通过 `new FileReader("input.txt")` 创建了一个输入流,然后创建了一个词法分析器对象 `Lexer`,并将输入流传递给它。在 `while` 循环中,调用 `lexer.yylex()` 方法获取下一个词法单元的返回值,直到返回值为 -1。 执行该代码后,将输出所有识别出的词法单元的返回值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值