Skip to content
/ Lexer Public

一个可爱的、(可能)高效的、支持大部分Flex语法的一个Java词法分析器

Notifications You must be signed in to change notification settings

chtzs/Lexer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lexer

一个可爱的、(可能)高效的、支持大部分Flex语法的一个Java词法分析器

这个项目怎么玩?

  1. 用IDEA(或者别的开发工具)编译导出jar包,这里我假设你的jar为c-flex.jar
  2. 控制台调用
java -jar c-flex.jar path/to/file [path/to/output]

以解析并生成硬编码的、包含自动机的、高效的词法分析的Java源码文件。

3.用Java编译生成的文件,尝试输入并解析吧~

语法分析规约文件格式

格式仿照Flex文件,具体如下:

整体格式

整体格式被符号"%%"分割成如下三个部分 (皆为可选部分):

[Header]
%%
[Definitions]
%%
[Code]

Header

这里是头定义,词法分析器会把这部分的内容原封不动地复制到目标文件的开头,一般用来导入包。

注意:连续的四个%会被词法分析器解释为两个%以转义


Definitions

这里是定义区域,用来定义单词符号串的正则规则,或者开关一些设置,或者内联一些代码

注释

//开头的单行是注释,会被忽略。

转义

用双引号"前后围绕起来的会被转义,这些文本全部都会被解释为原始文本

比如:"(abc\n)*"就是字符串(abc\n)*,不会被解释为正则

同时,反斜杠\开头的字符也会被转义(除非在双引号转义中)

正则定义

格式为:[标识符] = 正则

其中正则部分可以通过{{标识符}}来引用先前定义的正则

开关设置

设置皆以%开头,有如下设置可以使用:

%public 
%private
%protected
%package-protected
这些是控制类的修饰符的开关

%class 类名
这个是控制生成的Java类的开关

%unicode
这个是切换到unicode模式
这个功能暂时是默认打开的

%rollback-optimization
这个是词法分析回滚优化
如果你定义的文法结构需要大量回滚,建议开启此选项

%console
这个是使生成的文件编译后,在控制台调用时如果没有输入参数,则直接从控制台读取用户输入字符流。

内联代码

以下形式的 %{[代码]}% 中的[代码]会被内联到生成的主class中

注意:连续的}%}%会被解释成一个}%以转义


Code

这里是代码区,可以有和Definitions区域一样的注释,主要格式如下:

[正则] {[代码]}

意思是如果遇到[正则],则执行{[代码]}中的Java代码。 同样的,正则可以通过{{标识符}}引用Definitons区域中的已经定义的正则。


Example

Example项目的词法分析规约简单地实现了一个语法分析器yacc的一个词法分析程序。

鸣谢

项目本身参考了开源Java词法分析器项目JFlex,编译原理“龙书” ——《Compilers: Principles, Techniques, and Tools》,编译器设计 ——《Engineering a Compiler》。

没有这些资料,项目就不可能存在,感谢作者。

About

一个可爱的、(可能)高效的、支持大部分Flex语法的一个Java词法分析器

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published