DSL語法解析器生成器:dropincc.java
dropincc.java 是
- 一個簡單、好用的語法解析器生成器;
- 專為java語言環境下,實施DSL方案而設計;
- 特點:使用純java語法(Fluent Interface)制定用戶的詞法、語法規則;jdk1.6 compiler API動態編譯為字節碼;自動管理字節碼、用戶無需關心具體生成的解析器源碼;專為DSL打造,相對與使用其它常見工具(javacc, antlr等)做DSL解析,代碼量急劇下降;上手較為容易,讓用戶更加關注自身業務內容
- 需要jdk1.6或以上版本運行,無任何其它依賴
- 識別LL(*)語法
/**
* EBNF of Calculator:
* <pre>
* calc ::= expr $
* expr ::= addend (('+'|'-') addend)*
* addend ::= factor (('*'|'/') factor)*
* factor ::= '(' expr ')'
* | '\\d+(\\.\\d+)?'
* </pre>
*/
public static void main(String... args) throws Throwable {
Lang c = new Lang("Calculator");
Grule expr = c.newGrule();
c.defineGrule(expr, CC.EOF).action(new Action() {
public Double act(Object matched) {
return (Double) ((Object[]) matched)[0];
}
});
TokenDef a = c.newToken("\\+");
Grule addend = c.newGrule();
expr.define(addend, CC.ks(a.or("\\-"), addend)).action(new Action() {
public Double act(Object matched) {
Object[] ms = (Object[]) matched;
Double a0 = (Double) ms[0];
Object[] aPairs = (Object[]) ms[1];
for (Object p : aPairs) {
String op = (String) ((Object[]) p)[0];
Double a = (Double) ((Object[]) p)[1];
if ("+".equals(op)) {
a0 += a;
} else {
a0 -= a;
}
}
return a0;
}
});
TokenDef m = c.newToken("\\*");
Grule factor = c.newGrule();
addend.define(factor, CC.ks(m.or("/"), factor)).action(new Action() {
public Double act(Object matched) {
Object[] ms = (Object[]) matched;
Double f0 = (Double) ms[0];
Object[] fPairs = (Object[]) ms[1];
for (Object p : fPairs) {
String op = (String) ((Object[]) p)[0];
Double f = (Double) ((Object[]) p)[1];
if ("*".equals(op)) {
f0 *= f;
} else {
f0 /= f;
}
}
return f0;
}
});
factor.define("\\(", expr, "\\)").action(new Action() {
public Double act(Object matched) {
return (Double) ((Object[]) matched)[1];
}
}).alt("\\d+(\\.\\d+)?").action(new Action() {
public Double act(Object matched) {
return Double.parseDouble((String) matched);
}
});
Exe exe = c.compile();
System.out.println(exe.eval("1 +2+3+(4 +5*6*7*(64/8/2/(2/1 )/1)*8 +9 )+ 10"));
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!