一个可爱的、(可能)高效的、支持大部分Flex语法的一个Java词法分析器
- 用IDEA(或者别的开发工具)编译导出jar包,这里我假设你的jar为c-flex.jar
- 控制台调用
java -jar c-flex.jar path/to/file [path/to/output]
以解析并生成硬编码的、包含自动机的、高效的词法分析的Java源码文件。
3.用Java编译生成的文件,尝试输入并解析吧~
格式仿照Flex文件,具体如下:
整体格式被符号"%%"分割成如下三个部分 (皆为可选部分):
[Header]
%%
[Definitions]
%%
[Code]
这里是头定义,词法分析器会把这部分的内容原封不动地复制到目标文件的开头,一般用来导入包。
注意:连续的四个%会被词法分析器解释为两个%以转义
这里是定义区域,用来定义单词符号串的正则规则
,或者开关一些设置
,或者内联一些代码
。
//开头的单行是注释,会被忽略。
用双引号"前后围绕起来的会被转义,这些文本全部都会被解释为原始文本
比如:"(abc\n)*"就是字符串(abc\n)*,不会被解释为正则
同时,反斜杠\开头的字符也会被转义(除非在双引号转义中)
格式为:[标识符] = 正则
其中正则部分可以通过{{标识符}}来引用先前定义的正则
设置皆以%开头,有如下设置可以使用:
%public
%private
%protected
%package-protected
这些是控制类的修饰符的开关
%class 类名
这个是控制生成的Java类的开关
%unicode
这个是切换到unicode模式
这个功能暂时是默认打开的
%rollback-optimization
这个是词法分析回滚优化
如果你定义的文法结构需要大量回滚,建议开启此选项
%console
这个是使生成的文件编译后,在控制台调用时如果没有输入参数,则直接从控制台读取用户输入字符流。
以下形式的
%{[代码]}%
中的[代码]
会被内联到生成的主class中
注意:连续的}%}%会被解释成一个}%以转义
这里是代码区,可以有和Definitions
区域一样的注释,主要格式如下:
[正则] {[代码]}
意思是如果遇到[正则],则执行{[代码]}中的Java代码。
同样的,正则可以通过{{标识符}}引用Definitons
区域中的已经定义的正则。
Example项目的词法分析规约简单地实现了一个语法分析器yacc的一个词法分析程序。
项目本身参考了开源Java词法分析器项目JFlex,编译原理“龙书” ——《Compilers: Principles, Techniques, and Tools》,编译器设计 ——《Engineering a Compiler》。
没有这些资料,项目就不可能存在,感谢作者。