javaCC

javaCC
JAVA版 yacc lex 啊,lucene 使用这个来做 query 解析.
官方网站https://javacc.dev.java.net/
ibm DW介绍
JavaCC、解析树和 XQuery 语法
http://www-900.ibm.com/developerWorks/cn/xml/x-javacc/part1/index.shtml
现在你可以定义自己的语言!
http://www-900.ibm.com/developerWorks/cn/dmdd/library/techarticles/dm-0401brereton/index.shtml
javaworld 上文章
Build your own languages with JavaCC :
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-cooltools-p2.html
JavaCC 使用 .jj 的文件
一个简单的计算器Calculator.jj
使用javacc Calculator.jj生成parser
jjdoc Calculator.jj生成BNF

options { LOOKAHEAD=2; }

PARSER_BEGIN(Calculator)
public class Calculator {
public static void main(String args[]) throws ParseException { Calculator parser = new Calculator(System.in);
while (true) { parser.parseOneLine(); } } }
PARSER_END(Calculator)
SKIP : { " " | "/r" | "/t" }
TOKEN: { < NUMBER: ()+ ( "." ()+ )? > | < DIGIT: ["0"-"9"] > | < EOL: "/n" > }
void parseOneLine(): { double a; }
{ a=expr() { System.out.println(a); } | | { System.exit(-1); } }
double expr(): { double a; double b; }
{ a=term() ( "+" b=expr() { a += b; } | "-" b=expr() { a -= b; } )* { return a; } }
double term(): { double a; double b; }
{ a=unary() ( "*" b=term() { a *= b; } | "/" b=term() { a /= b; } )* { return a; } }
double unary(): { double a; }
{ "-" a=element() { return -a; } | a=element() { return a; } }
double element(): { Token t; double a; }
{ t= { return Double.parseDouble(t.toString()); } | "(" a=expr() ")" { return a; } }

【javaCC】from 新云: javaCC

    推荐阅读