常识介绍:
Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler
Lex 和 C 是强耦合的。一个 .lex 文件(Lex 文件具有 .lex 的扩展名)通过 lex 公用程序来传递,并生成 C 的输出文件。这些文件被编译为词法分析器的可执行版本。
Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语 法解析器。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例,Yacc 文件有 .y 后缀。编译行如下调用 Yacc 编译器:
$ yacc <options>
<filename ending with .y>
|
参考:http://www.ibm.com/developerworks/cn/linux/sdk/lex/index.html#8
Java中的应用:
1、JFLEX 配置文件编写
配置文件以.flex为扩展名,整个文档分为三个部分,使用%%划分
1. 用户代码
2. 选项与声明
3. 词法规则
形式形如:
用户代码 ……………………………………………………………………………. ……………………………………………………………………………. %% 选项与声明 ……………………………………………………………………………. …………………………………………………………………………….. %% 词法规则 ……………………………………………………………………………….. |
示例说明
%states A, B
%xstates C
%%
expr1 { yybegin(A); action }
<YYINITIAL, A> expr2 { action }
<A> {
expr3 { action }
<B,C> expr4 { action }
}
解释:
1. 首先确认A,B状态是包含状态,C是排除状态,默认状态YYINITIAL总是隐式的不需要被声明。
2. expr1不存在状态列表,他可以匹配任何状态,除了排除状态C。状态跳转到A状态。
3. expr2只能匹配YYINITIAL和A状态。
4. expr3只能匹配A状态
5. expr4能够匹配A,B,C三个状态
6. 总而言之,包含状态和排除状态的只有在规则前没有状态列表时才体现出来。那些状态列表为空的规则只能匹配除排除状态以外的所有规则。
转载于:https://blog.51cto.com/tianya23/632993