使用JavaCC做语法分析
2011-11-23 18:31
281 查看
本文来自于http://www.360doc.com/content/09/0201/17/62379_2434227.shtml
Javacc 的输入文件
Javacc 的输入文件格式做得比较简单.每个非终结符产生式对应一个Class中的函数,函数中可以嵌入相应的识别出该终结符文法时候的处理代码(也叫动作).
下面我们来看看Javacc中自带的example中的例子. 这个例子可以在javacc-3.2/doc/examples/SimpleExamples/Simple1.jj看到
PARSER_BEGIN(Simple1)
public class Simple1 {
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input(); } }
PARSER_END(Simple1)
void Input() : {}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
void MatchedBraces() : {}
{
"{" [ MatchedBraces() ] "}"
}
设置好javacc的bin目录后,在命令提示符下输入javacc Simple1.jj ,然后 javacc 就会为你生成下面几个 java 源代码文件:
Simple1.java
Simple1TokenManager.java
Simple1Constants.java
SimpleCharStream.java
Token.java
TokenMgrError.java
其中Simple1就是你的语法分析器的对象,它的构造函数参数就是要分析的输入流,这里的是System.in. class Simple1 就定义在标记
PARSER_BEGIN(Simple1)
PARSER_END(Simple1) 之间. 但是必须清楚的是,PARSER_BEGIN和PARSER_END中的名字必须是词法分析器的名字(这里是Simple1).
PARSER_END 下面的定义就是文法非终结符号的定义了.
Simple1 的文法基本就是:
Input -> MatchedBraces ("\n"|"\r")* <EOF>
MatchedBraces -> “ { “ MatchedBraces “ } ”
从它的定义我们可以看到 , 每个非终结符号对于一个过程 .
比如 Input 的过程
void Input() :
{}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
在定义 void Input 后面记住需要加上一个冒号 ”:”, 然后接下来是两个块 {} 的定义 . 第一个 {} 中的代码是定义数据 , 初试化数据的代码 . 第二个 {} 中的部分就是真正定义 Input 的产生式了 . 每个产生式之间用 ”|” 符号连接 . 注意 : 这里的产生式并非需要严格 BNF 范式文法 , 它的文法既可以是 BNF, 同时还可以是混合了正则表达式中的定义方法 . 比如上面的 Input -> MatchedBraces ("\n"|"\r")* <EOF> 中 (“\n”|”\r”)* 就是个正则表达式 , 表示的是 \n 或者 \r 的 0 个到无限个的重复的记号 .
<EOF> 是 javacc 系统定义的记号 (TOKEN), 表示文件结束符号 . 除了 <EOF>, 无论是系统定义的 TOKEN, 还是自定义的 TOKEN, 里面的 TOKEN 都是以 <token’s name> 的方式表示 .
每个非终结符号 (Input 和 MatchedBraces) 都会在 javacc 生成的 Simple1.java 中形成 Class Simple1 的成员函数 . 当你在外部调用 Simple1 的 Input, 那么语法分析器就会开始进行语法分析了 .
Javacc 的输入文件
Javacc 的输入文件格式做得比较简单.每个非终结符产生式对应一个Class中的函数,函数中可以嵌入相应的识别出该终结符文法时候的处理代码(也叫动作).
下面我们来看看Javacc中自带的example中的例子. 这个例子可以在javacc-3.2/doc/examples/SimpleExamples/Simple1.jj看到
PARSER_BEGIN(Simple1)
public class Simple1 {
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input(); } }
PARSER_END(Simple1)
void Input() : {}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
void MatchedBraces() : {}
{
"{" [ MatchedBraces() ] "}"
}
设置好javacc的bin目录后,在命令提示符下输入javacc Simple1.jj ,然后 javacc 就会为你生成下面几个 java 源代码文件:
Simple1.java
Simple1TokenManager.java
Simple1Constants.java
SimpleCharStream.java
Token.java
TokenMgrError.java
其中Simple1就是你的语法分析器的对象,它的构造函数参数就是要分析的输入流,这里的是System.in. class Simple1 就定义在标记
PARSER_BEGIN(Simple1)
PARSER_END(Simple1) 之间. 但是必须清楚的是,PARSER_BEGIN和PARSER_END中的名字必须是词法分析器的名字(这里是Simple1).
PARSER_END 下面的定义就是文法非终结符号的定义了.
Simple1 的文法基本就是:
Input -> MatchedBraces ("\n"|"\r")* <EOF>
MatchedBraces -> “ { “ MatchedBraces “ } ”
从它的定义我们可以看到 , 每个非终结符号对于一个过程 .
比如 Input 的过程
void Input() :
{}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
在定义 void Input 后面记住需要加上一个冒号 ”:”, 然后接下来是两个块 {} 的定义 . 第一个 {} 中的代码是定义数据 , 初试化数据的代码 . 第二个 {} 中的部分就是真正定义 Input 的产生式了 . 每个产生式之间用 ”|” 符号连接 . 注意 : 这里的产生式并非需要严格 BNF 范式文法 , 它的文法既可以是 BNF, 同时还可以是混合了正则表达式中的定义方法 . 比如上面的 Input -> MatchedBraces ("\n"|"\r")* <EOF> 中 (“\n”|”\r”)* 就是个正则表达式 , 表示的是 \n 或者 \r 的 0 个到无限个的重复的记号 .
<EOF> 是 javacc 系统定义的记号 (TOKEN), 表示文件结束符号 . 除了 <EOF>, 无论是系统定义的 TOKEN, 还是自定义的 TOKEN, 里面的 TOKEN 都是以 <token’s name> 的方式表示 .
每个非终结符号 (Input 和 MatchedBraces) 都会在 javacc 生成的 Simple1.java 中形成 Class Simple1 的成员函数 . 当你在外部调用 Simple1 的 Input, 那么语法分析器就会开始进行语法分析了 .
相关文章推荐
- 使用JavaCC做语法分析[转]
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- lucene javacc 语法解析器结构分析
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- 使用开源Echarts为Splunk打造类似语法驱动的分析可视化
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- PostgreSQL 语法分析中所使用的List
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- 语法分析 词法识别 工具 ANTLR3.x 的安装(windows)与使用
- JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(一)
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程