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
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)