如果您不希望评估某些子树,则需要让树规则返回节点而不是实际值.您可以扩展CommonTree并提供自定义TreeAdaptor来帮助构建自己的节点,但就个人而言,我发现最简单的方法是创建自定义节点类(或类)并使用它们.一个演示澄清:

T.G

grammar T;

options {

output=AST;

}

tokens {

ASSIGNMENT;

}

parse

: statement+ EOF -> statement+

;

statement

: ifStatement

| assignment

;

ifStatement

: IF a=expression THEN b=expression (ELSE c=expression)? -> ^(IF $a $b $c?)

;

assignment

: ID '=' expression -> ^(ASSIGNMENT ID expression)

;

expression

: orExpression

;

orExpression

: andExpression (OR^ andExpression)*

;

andExpression

: equalityExpression (AND^ equalityExpression)*

;

equalityExpression

: relationalExpression (('==' | '!=')^ relationalExpression)*

;

relationalExpression

: atom (('<=' | '=' | '>')^ atom)*

;

atom

: BOOLEAN

| NUMBER

| ID

| '(' expression ')' -> expression

;

IF : 'if';

THEN : 'then';

ELSE : 'else';

OR : 'or';

AND : 'and';

BOOLEAN : 'true' | 'false';

ID : ('a'..'z' | 'A'..'Z')+;

NUMBER : '0'..'9'+ ('.' '0'..'9'+)?;

SPACE : (' ' | '\t' | '\r' | '\n') {skip();};

Main.java

我创建了一个具有eval():Object方法的Node接口,还创建了一个实现Node的抽象类BinaryNode,并且总是有2个子节点.正如您在这些Java类之后的树语法中所看到的,所有规则现在都返回一个Node.

import org.antlr.runtime.*;

import org.antlr.runtime.tree.*;

public class Main {

public static void main(String[] args) throws Exception {

String source = "a = 3 b = 4 if b > a then b==b else c==c";

TLexer lexer = new TLexer(new ANTLRStringStream(source));

TParser parser = new TParser(new CommonTokenStream(lexer));

TWalker walker = new TWalker(new CommonTreeNodeStream(parser.parse().getTree()));

Node root = walker.walk();

System.out.println(root.eval());

}

}

interface Node {

Object eval();

}

abstract class BinaryNode implements Node {

protected Node left;

protected Node right;

public BinaryNode(Node l, Node r) {

left = l;

right = r;

}

}

class AtomNode implements Node {

private Object value;

public AtomNode(Object v) {

value = v;

}

@Override

public Object eval() {

return value;

}

}

class OrNode extends BinaryNode {

public OrNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Boolean)super.left.eval() || (Boolean)super.right.eval();

}

}

class AndNode extends BinaryNode {

public AndNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Boolean)super.left.eval() && (Boolean)super.right.eval();

}

}

class LTNode extends BinaryNode {

public LTNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Double)super.left.eval() < (Double)super.right.eval();

}

}

class LTEqNode extends BinaryNode {

public LTEqNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Double)super.left.eval() <= (Double)super.right.eval();

}

}

class GTNode extends BinaryNode {

public GTNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Double)super.left.eval() > (Double)super.right.eval();

}

}

class GTEqNode extends BinaryNode {

public GTEqNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return (Double)super.left.eval() >= (Double)super.right.eval();

}

}

class EqNode extends BinaryNode {

public EqNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return super.left.eval().equals(super.right.eval());

}

}

class NEqNode extends BinaryNode {

public NEqNode(Node left, Node right) { super(left, right); }

@Override

public Object eval() {

return !super.left.eval().equals(super.right.eval());

}

}

class VarNode implements Node {

private java.util.Map memory;

private String var;

VarNode(java.util.Map m, String v) {

memory = m;

var = v;

}

@Override

public Object eval() {

Object value = memory.get(var);

if(value == null) {

throw new RuntimeException("Unknown variable: " + var);

}

return value;

}

}

class IfNode implements Node {

private Node test;

private Node ifTrue;

private Node ifFalse;

public IfNode(Node a, Node b, Node c) {

test = a;

ifTrue = b;

ifFalse = c;

}

@Override

public Object eval() {

return (Boolean)test.eval() ? ifTrue.eval() : ifFalse.eval();

}

}

TWalker.g

tree grammar TWalker;

options {

tokenVocab=T;

ASTLabelType=CommonTree;

}

@members {

private java.util.Map memory = new java.util.HashMap();

}

walk returns [Node n]

: (statement {$n = $statement.n;})+

;

statement returns [Node n]

: ifStatement {$n = $ifStatement.n;}

| assignment {$n = null;}

;

assignment

: ^(ASSIGNMENT ID expression) {memory.put($ID.text, $expression.n.eval());}

;

ifStatement returns [Node n]

: ^(IF a=expression b=expression c=expression?) {$n = new IfNode($a.n, $b.n, $c.n);}

;

expression returns [Node n]

: ^(OR a=expression b=expression) {$n = new OrNode($a.n, $b.n);}

| ^(AND a=expression b=expression) {$n = new AndNode($a.n, $b.n);}

| ^('==' a=expression b=expression) {$n = new EqNode($a.n, $b.n);}

| ^('!=' a=expression b=expression) {$n = new NEqNode($a.n, $b.n);}

| ^('<=' a=expression b=expression) {$n = new LTEqNode($a.n, $b.n);}

| ^('

| ^('>=' a=expression b=expression) {$n = new GTEqNode($a.n, $b.n);}

| ^('>' a=expression b=expression) {$n = new GTNode($a.n, $b.n);}

| BOOLEAN {$n = new AtomNode(Boolean.valueOf($BOOLEAN.text));}

| NUMBER {$n = new AtomNode(Double.valueOf($NUMBER.text));}

| ID {$n = new VarNode(memory, $ID.text);}

;

如果您现在运行主类,并评估:

a = 3

b = 4

if b > a then

b==b

else

c==c

正在打印到控制台:

bart@hades:~/Programming/ANTLR/Demos/T$java -cp antlr-3.3.jar org.antlr.Tool T.g

bart@hades:~/Programming/ANTLR/Demos/T$java -cp antlr-3.3.jar org.antlr.Tool TWalker.g

bart@hades:~/Programming/ANTLR/Demos/T$javac -cp antlr-3.3.jar *.java

bart@hades:~/Programming/ANTLR/Demos/T$java -cp .:antlr-3.3.jar Main

true

但是,如果你检查b< a,导致执行else,你会看到以下内容:

Exception in thread "main" java.lang.RuntimeException: Unknown variable: c

at VarNode.eval(Main.java:140)

at EqNode.eval(Main.java:112)

at IfNode.eval(Main.java:160)

at Main.main(Main.java:11)

有关更复杂的语言结构(范围,函数等)的实现,请参阅my blog.

祝好运!

java if else程序,java – if then else条件评估相关推荐

  1. Java网页小程序——Java Applet

    Java Applet是编译过的Java程序,可以在所有支持Java的浏览器中运行. 1.Applet的使用 import java.applet.Applet; import java.awt.Gr ...

  2. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  3. java模拟洗衣机程序,java洗衣机仿真程序实验报告及代码.doc

    java洗衣机仿真程序实验报告及代码.doc 11.实验题目:用java编写洗衣机仿真程序2.实验目的:1.熟悉并掌握洗衣机(全自动)的工作原理和运行过程.2.学会软件工程设计中的一系列分析研究,对需 ...

  4. java桥牌发牌程序,java桥牌发牌算法 | 学步园

    参考文章: ---------------------------------------------------------------------------------------------- ...

  5. java冒泡法程序,Java基础之冒泡法的实现

    没有注释,不过应该还好理解. 啥也不多说了,直接上代码. /** * 冒泡法排序 */ public class MaoPao { public static void main(String[] a ...

  6. Java Hello World程序

    Whenever we start to learn a programming language, the first program is always to print the Hello Wo ...

  7. Java学习笔记(java基础)

    Java学习笔记(第一周) Java 介绍 Java 发展方向 JVM , JDK , JRE 名词解释 Java语言的特点 Java安装 安装包的下载 配置环境变量 验证是否安装成功 Java的第一 ...

  8. java-web测试题cpu_tomcat+java的web程序持续占cpu高问题调试【转】

    转自 tomcat+java的web程序持续占cpu问题调试 - 像风一样的自由 - CSDN博客 http://blog.csdn.net/five3/article/details/2841677 ...

  9. java体重指数计算器程序_java 学习 ——计算器小程序

    简易计算器小程序代码: package jisuanqi; //声明需要插入的包 import java.awt.*; import java.lang.Object; import java.lan ...

最新文章

  1. 什么决定了程序员的价格,程序员该如何溢价
  2. ABAP销售合同删除Bapi
  3. [转载]最完整PHP.INI中文版
  4. P1220-关路灯【区间dp】
  5. PrimeFaces:在动态生成的对话框中打开外部页面
  6. Kafka Broker常用配置详解
  7. (15)System Verilog结构体struct详解
  8. Hibernate 拦截器 SQL语句提交前 更新表公共字段
  9. sun认证 java怎么考_Sun认证Java程序员考试技巧分享
  10. 万恶的Tomcat8.5
  11. 嗨!爱莫就是传说中隔壁家公司 | 精彩传送门
  12. 支持亿级标签接入,ClickHouse在广域物联网云平台架构的探索与实践
  13. 微信群活码,一个能够将用户自动分流的工具
  14. 用C++编写一个简易数学计算器
  15. java创建word并设置基本属性,Java 生成word如何将word设置为只读属性
  16. Eclips IDE安装Python
  17. 3原色对照表.....
  18. 工业协议:DNP协议
  19. Mybatis---主键回填 (*^▽^*)
  20. unity3d C#用匿名委托循环注册按钮点击事件报错:索引超界 ArgumentOutOfRangeException: Index was out of range. Must be non-ne

热门文章

  1. Nginx handler模块
  2. 容器编排技术 -- 使用Minikube集群
  3. oracle 压力测试工具benchmarksql
  4. 北方民族大学计算机全国排名,校友会:全国15所民族类大学排名,这三所大学进入十强...
  5. 设计模式 - 七大设计原则(一)
  6. git 子命令 git tag 常用命令实操教程
  7. 【踩坑记录】Tensorflow在Windows下使用
  8. C#LeetCode刷题之#231-2的幂(Power of Two)
  9. 如何使用此功能强大的工具将Wemo添加到Homekit
  10. 作为开发者发布小程序_如何建立个人品牌作为新开发者