Javacc的例子

本文介绍如何使用JavaCC工具生成语法分析器,并通过一个简单示例展示其工作原理及配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


[@more@]

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() (" "|" ")*
}
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 (" "|" ")*
MatchedBraces -> “{“ MatchedBraces “}”

从它的定义我们可以看到,每个非终结符号对于一个过程。比如Input的过程

void Input() :
{}
{
MatchedBraces() (" "|" ")*
}

在定义void Input后面记住需要加上一个冒号“:”,然后接下来是两个块{}的定义。
第一个{}中的代码是定义数据,初试化数据的代码。第二个{}中的部分就是真正定义Input的产生式了。
每个产生式之间用”|”符号连接。
注意:这里的产生式并非需要严格BNF范式文法,它的文法既可以是BNF,同时还可以是混合了正则表达式中的定义方法。比如上面的 Input -> MatchedBraces (" "|" ")*
中(“ ”|” ”)* 就是个正则表达式,表示的是 或者 的0个到无限个的重复的记号。而是javacc系统定义的记号(TOKEN),表示文件结束符号。
除了,无论是系统定义的TOKEN,还是自定义的TOKEN, 里面的TOKEN都是以的方式表示。

每个非终结符号(Input和MatchedBraces)都会在javacc生成的Simple1.java中形成Class Simple1的成员函数。当你在外部调用Simple1的Input,那么语法分析器就会开始进行语法分析了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10230672/viewspace-966505/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10230672/viewspace-966505/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值