这个例子实际上就是官方来的(暂时没除法,当然加一个也非常简单),就是演示下这个工具的强大之处,
之前项目中对用户输入的表达式(当然不适简单的四则运算,包括用户函数的)。
琢磨了两三天官方的英文文档,google也能零散的搜索到一些中文资料。
主要是前一篇提了下表达式求值,所以这个正好也是个解法,就算个呼应吧。
没心情长篇大论地介绍antlr了。零星提一点能记起来的概念,
基于编译原理,EBNF范式,LL(*)文法,
Lexer,Parser,TreeParser,
Lexer将所入的字符留转换成后序分析用的token,Parser接收token产生树(再由TreeParser处理这个树来产生结果)或者直接输出结果
将*.g文件用命令行工具处理就能产生源码,再配合自己的代码完成语法解析过程。
先贴个语法文件,完整代码见附件
//Expr.g
grammar Expr;
@header {
import java.util.HashMap;
}
@members {
/** Map variable name to Integer object holding value */
HashMap memory = new HashMap();
}
prog: (stat NEWLINE*)+ ;
stat: expr {System.out.println($expr.value);}
| ID '=' expr
{memory.put($ID.text, new Integer($expr.value));}
;
expr returns [int value]
: e=multExpr {$value = $e.value;}
( '+' e=multExpr {$value += $e.value;}
| '-' e=multExpr {$value -= $e.value;}
)*
;
multExpr returns [int value]
: e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
;
atom returns [int value]
: INT {$value = Integer.parseInt($INT.text);}
| ID
{
Integer v = (Integer)memory.get($ID.text);
if ( v!=null ) $value = v.intValue();
else System.err.println("undefined variable "+$ID.text);
}
| '(' expr ')' {$value = $expr.value;}
;
ID : ('a'..'z'|'A'..'Z')+ ;
INT : '0'..'9'+ ;
NEWLINE:'\r'? '\n' ;
WS : (' '|'\t')+ {skip();} ;
分享到:
相关推荐
赠送jar包:antlr4-runtime-4.2.jar; 赠送原API文档:antlr4-runtime-4.2-javadoc.jar; 赠送源代码:antlr4-runtime-4.2-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.2.pom; 包含翻译后的API文档:...
赠送jar包:antlr4-runtime-4.7.jar; 赠送原API文档:antlr4-runtime-4.7-javadoc.jar; 赠送源代码:antlr4-runtime-4.7-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.7.pom; 包含翻译后的API文档:...
赠送jar包:antlr4-runtime-4.7.jar; 赠送原API文档:antlr4-runtime-4.7-javadoc.jar; 赠送源代码:antlr4-runtime-4.7-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.7.pom; 包含翻译后的API文档:...
赠送jar包:antlr-runtime-3.4.jar; 赠送原API文档:antlr-runtime-3.4-javadoc.jar; 赠送源代码:antlr-runtime-3.4-sources.jar; 赠送Maven依赖信息文件:antlr-runtime-3.4.pom; 包含翻译后的API文档:antlr-...
JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源...
赠送jar包:antlr-runtime-3.5.jar; 赠送原API文档:antlr-runtime-3.5-javadoc.jar; 赠送源代码:antlr-runtime-3.5-sources.jar; 赠送Maven依赖信息文件:antlr-runtime-3.5.pom; 包含翻译后的API文档:antlr-...
这是antlr在idea上的插件,因为官网太慢,这里做个备份 这个是2020 antlr-intellij-plugin-v4-1.14.zip
赠送jar包:antlr-runtime-3.5.2.jar; 赠送原API文档:antlr-runtime-3.5.2-javadoc.jar; 赠送源代码:antlr-runtime-3.5.2-sources.jar; 赠送Maven依赖信息文件:antlr-runtime-3.5.2.pom; 包含翻译后的API文档...
antlr-runtime-3.2.jar
antlr-2.7.7.jar和antlr-2.7.6.jar
antlr3.12--工具+JAR+例子
官方离线安装包,亲测可用
官方离线安装包,亲测可用
antlr-3.5.2-complete.jar
antlr 2.7.7源码,下载自:http://repo.spring.io/plugins-release/org/antlr/com.springsource.antlr/2.7.7/
antlr4-short-course antlr4-short-course antlr4-short-course
antlr-4.6-complete.jar
官方版本,亲测可用
The Definitive ANTLR Reference--Building Domain Specific Languages.