且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JFLEX词法分析和BYACC语法分析

更新时间:2022-08-20 20:22:35

 常识介绍:

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.      首先确认AB状态是包含状态,C是排除状态,默认状态YYINITIAL总是隐式的不需要被声明。

2.      expr1不存在状态列表,他可以匹配任何状态,除了排除状态C。状态跳转到A状态。

3.      expr2只能匹配YYINITIAL和A状态。

4.      expr3只能匹配A状态

5.      expr4能够匹配A,B,C三个状态

6.      总而言之,包含状态和排除状态的只有在规则前没有状态列表时才体现出来。那些状态列表为空的规则只能匹配除排除状态以外的所有规则。

 


本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/632993,如需转载请自行联系原作者