Javacc实例及代码详解_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Javacc实例及代码详解

Javacc实例及代码详解

 2011/9/23 8:28:36  wanghuanqiu  http://wanghuanqiu.iteye.com  我要评论(0)
  • 摘要:javaCC是一个能生成语法和词法分析器的生成程序。语法和词法分析器是字符串处理软件的重要组件。编译器和解释器集成了词法和语法分析器来解释那些含有程序的文件.如果想详细了解javacc可以在网上收集到很多资料。这里举一个简单的javacc实例帮助大家学习javacc首先下载javacc的eclipse插件,然后再eclipse.exe目录中安装即可。这是新建中就会出现新建javacc文件。有三种类型文件为jj、jjt、jtb,本章介绍jj的文件例子。是一个简单加减法的例子,并返回结果代码如下
  • 标签:详解 Java 代码 实例

???? javaCC 是一个能生成语法和词法分析器的生成程序。语法和词法分析器是字符串处理软件的重要组件。编译器和解释器集成了词法和语法分析器来解释那些含有程序的文件.

如果想详细了解javacc可以在网上收集到很多资料。

??? 这里举一个简单的javacc实例帮助大家学习javacc

首先下载javacc的eclipse插件,然后再eclipse.exe目录中安装即可。

这是新建中就会出现新建javacc文件。有三种类型文件为jj、jjt、jtb,本章介绍jj的文件例子。是一个简单加减法的例子,并返回结果

?? 代码如下:

?options{
? STATIC = true;

? //options有如下的选项

?

//CHOICE_AMBIGUITY_CHECK=true;

//OTHER_AMBIGUITY_CHECK =true;

//DEBUG_PARSER=true;

//DEBUG_TOKEN_MANAGER=true;

?

//?FORCE_LA_CHECK=true;
??//?DEBUG_PARSER = true;//以debug形式生成,便于调试.
??//?STATIC=false; //生成非静态类.
??//?LOOKAHEAD=3;
//向前看三个字母,消除歧义用的

?


}
PARSER_BEGIN(Fei)//名称的开始,和类名相同
package com.demo16;
import java.io.Reader;
import java.io.StringReader;
public class Fei{

?

//如果需要定义一些动作再次类中写方法,此方法为转换为字符
? public Fei(String expr){
??? this ((Reader)new StringReader(expr));
? }
? public static void main(String args[])throws ParseException{
??? Fei fei = new Fei(System.in);//实例化,并且有一个输入参数
??? System.out.println(fei.elexpr());//输出结果
? }
}
PARSER_END(Fei)//结束
SKIP:{//分析器忽略不计的字符
? " "
? | "\r"
? | "\t"
? | "\n"
}

//定义的字符,一些正则表达式
TOKEN[IGNORE_CASE]://自定义的字符,IGNORE_CASE不计大小写
? <ADD:"+">
? | <SUB:"-">
? | <RK:"(">
? | <LK:")">
? | <NUMBER:(["1"-"9"])*(["0"-"9"])+>
}

?

//SPECIAL_TOKEN:{特殊字符分析器不进行语法解析但会给解释器}

?

//MORE:{ 这些定义的字符是放在缓存里的,个人理解为必须出现的字符}

//接下来这些方法为BNF范式,javacc是自上而下的分析方法,所以要推出左推导,不能有左递归
double elexpr():{
? double temp = 0;
}
{
? temp = expr(){
??? return temp;//返回值
? }
}
double expr():{
? double temp = 0;
? double first, second;
}
{
? first = term(){
??? temp = first;
? }
? (<ADD>second = term(){
??? temp = first+second;//实际加法运算
? }
? | <SUB>second = term(){
??? temp = first-second;//实际减法运算
? }
? )*//可以出现0次或多次

{
??? return temp;
? }
}
double term():{
? double temp = 0;
? Token t;
}
{
? t = <NUMBER>{
??? return Double.parseDouble(t.image);//image是字符域,保存当前的值
? }
? | <RK>temp = expr()<LK>{
??? return temp;
? }
}

?

?

?

?

例如输入8+(5-3) 回车输出? 9

?

发表评论
用户名: 匿名