这个例子实际上就是官方来的(暂时没除法,当然加一个也非常简单),就是演示下这个工具的强大之处,
之前项目中对用户输入的表达式(当然不适简单的四则运算,包括用户函数的)。
琢磨了两三天官方的英文文档,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();} ;
分享到:
相关推荐
总的来说,这个压缩包提供了一个学习ANTLR如何处理SQL语句的实例。通过阅读和理解"sql.g"文件,你可以深入了解ANTLR的语法定义,以及如何将其应用于实际的Java项目中。同时,这个项目也展示了如何利用ANTLR的强大...
Delphi中可以使用如ANTLR或JCL的库来帮助解析表达式。 2. **算术运算符优先级和结合性**:在处理表达式时,了解运算符的优先级和结合性是必要的。例如,乘法和除法的优先级高于加法和减法,而括号可以改变运算的...
3. **表达式求值**:最后,解析器将构建出一个抽象语法树(AST),然后通过遍历这棵树来计算表达式的结果。在Java中,可以使用栈数据结构来辅助计算,每当遇到一个运算符时,就从栈中弹出相应的操作数,执行运算,...
此外,ANTLR允许在语法中使用属性和动作来扩展语法的能力,例如通过动作代码来计算表达式值或处理词法单元的特殊情况。使用语义谓词,开发者可以在解析过程中根据上下文信息动态地调整解析行为。而词法黑魔法是一种...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。...这些实例是学习ANTLR的宝贵资源,帮助开发者快速上手并应用于实际项目中。
- **一个树翻译的例子**:展示具体的树翻译实例。 - **检查/调试AST**:提供工具和技术来检查和调试抽象语法树。 #### 五、记号流(Token Streams) - **记号流**:是词法分析器输出的一系列记号,是语法分析器的...
这些符号通常是基于正则表达式的模式,例如标识符、数字、运算符等。Lexer不改变输入流的内容,而是对其进行分割并识别出符合特定规则的元素。 2. **Parser(解析器)** - Parser接收Lexer处理后的Token序列,然后...
3. 表达式求值:一旦有了AST,解析器就可以进行表达式的求值。这通常通过递归下降解析(Recursive Descent Parsing)或者操作符优先法(Operator Precedence Parsing)来实现,根据运算符的优先级和结合性,从叶子...
- **表达式求值**: OGNL 表达式在特定的对象上下文中进行求值,根据表达式的结构逐步执行相应的操作。 - **伪 Lambda 表达式**: 类似于 Lambda 表达式的功能,但不是真正的 Lambda 表达式。 - **集合的伪属性**: ...
这个测试类会创建ANTLR解析器的实例,输入一些示例语句,然后调用解析方法,观察输出是否符合预期。例如: ```java public class TestJerry { public static void main(String[] args) throws Exception { ...
例如,可以使用递归下降解析器或者更复杂如ANTLR这样的库来解析表达式。 4. **注册自定义运算符**:为了让解析器能够识别并正确处理自定义运算符,我们需要在解析器初始化时注册这些运算符。这通常是通过将枚举实例...
书中不仅有理论知识,还有丰富的实例,如JSON和R语言解析的例子,这些都是ANTLR用户不可缺少的参考。而对于初学者和资深开发者,这本书都是学习ANTLR和构建语言处理工具的良好指南。 ### 小结 在构建和维护编程语言...
* 解析表达式:使用ANTLR解析表达式,生成Ast节点。 * 节点解释器:每一个节点都有一个解释器,负责解释节点。 * 编译器:负责生成代码并编译。 Fel表达式引擎是一种高性能的表达式引擎,支持编译执行和解释执行两...
在这个名为"example-antlr"的项目中,我们看到的是一个Antlr4的示例集合,可能包含了如何使用ANTLR4进行语法解析和构建解析树的实例。这通常包括创建语法文件(.g4文件),生成解析器和词法分析器,以及编写Java代码...
AST能直观地表示出表达式的结构,方便后续的求值或优化。 3. **错误处理**:在解析过程中检测并处理语法错误,如未预期的符号、缺少操作数或不匹配的括号。 4. **运算优先级和结合性**:正确处理乘法先于加法、...
解析过程中,ANTLR会调用你在解析器类中定义的监听器方法,这些方法对应于语法规则中的各个节点,允许你处理每个解析事件,如计算表达式、执行函数调用等。 例如,你可以定义一个`MATLABListener`子类,覆盖其中的...
Java Archive (JAR) 文件是Java平台上...这个"学习的jar包"可能涵盖了上述知识的实例,包括如何创建、管理和使用JAR文件,是Java学习者的宝贵资源。通过研究和实践,可以深入了解Java应用程序的打包、运行和依赖管理。