Рубрики
Без рубрики

Познакомьтесь с JFlex

JFlex – это генератор сканеров для Java. Генератор сканера сгенерирует сканер (он же лексер) f… Помечено как программирование, синтаксический анализ, java, компиляторы.

JFlex – это генератор сканеров для Java. Генератор сканера сгенерирует сканер (он же лексер) для вас вместо того, чтобы вам пришлось писать его самому. JFlex создан по образцу (f) лекс только он написан на Java и генерирует Java-лексеры в отличие от двух старых инструментов.

Что такое гибкий рабочий процесс?

  • Создайте исходный файл JFlex (*.flex)
  • Используйте инструмент командной строки Flex для компиляции файла в файл 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 , то есть. студия. JFlex генерирует класс с именем Yylex с функцией yylex(). Давайте изменим это (мы все еще находимся в средней части нашего гибкого файла):

%class Lexer
%type String

%%

Это заставит JFlex изменить имя класса на Lexer, а yylex() вернет строку Java вместо Yytoken — класс, который мы не будем создавать.

План здесь состоит в том, чтобы заставить yylex() возвращать любой символ, который мы вводим на нашей клавиатуре — вот почему мы указываем его %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, чтобы остановить программу. Конечно, это не очень интересно, и вам не нужно использовать Java-файл 570 loc (да, именно такой длины сгенерированный лексер) только для эха символов.

Вы можете загрузить исходный код с Github .

Оригинал: “https://dev.to/vicentemaldonado/meet-jflex-59gd”