`
wjm251
  • 浏览: 108674 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

antlr实例-表达式求值

阅读更多
这个例子实际上就是官方来的(暂时没除法,当然加一个也非常简单),就是演示下这个工具的强大之处,
之前项目中对用户输入的表达式(当然不适简单的四则运算,包括用户函数的)。
琢磨了两三天官方的英文文档,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();} ;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics