匹配算数表达式语言

 The Definitive Antlr 4 Reference 2nd Edition  第4章第一小节 学习笔记

匹配算数表达式语言

本例中,只使用基本的算数运算(加,减,乘,除),括号表达式,整数,及变量。例如有如下的表达式。

193
a = 5
b = 6
a+b*2
(1+2)*3

在这里介绍的表达式语言,是由换行符所分割的一组语句构成。语句可以是表达式、赋值运算、或是一个空行。下面是用于解析上述语句及表达式的Antlr文法。

grammar expr;
prog : stat+;

stat : expr NEWLINE
     | ID '=' expr NEWLINE
     | NEWLINE
     ;

expr: expr ('*' | '/') expr
	| expr ('+' | '-') expr
	| INT
	| ID
	| '(' expr ')'
	;

ID : [a-zA-Z]+;
INT : [0-9]+;
NEWLINE: '\r'?'\n';

首先说明Antlr文法概念中的一些关键概念。

  1. 文法由一组描述语法的规则组成。其中包括词法与语法规则。
  2. 语法规则是以小写字母组成。如prog,stat。
  3. 词法规则由大写字母组成。如ID:[a-zA-Z]+。
  4. 通过使用 | 运算符来将不同的规则分割,还可以使用括号构成子规则。例如(‘*’ | ‘/’)会匹配多个乘号或除号。

上面的文法中 –> skip是一个指示符,用来告诉词法分析器来匹配,并丢弃这些空白符。

此外Antlr v4 的一个重要的特性是能够处理大多数的左递归规则。

文法文件写完后 鼠标右键文法文件 -> Generate Antlr......      随后会在指定的目录下生成XXparser 与 XXLexer文件。通过这些文件就可以完成分析任务了。

public class Main {

	public static void main(String[] args) {
		String expr = "(1+2*3/2-7))";
		ANTLRInputStream input = new ANTLRInputStream(expr);
		exprLexer lexer = new exprLexer(input);
		CommonTokenStream tokens = new CommonTokenStream(lexer);
		exprParser parser = new exprParser(tokens);
		ParseTree tree = parser.prog();
		System.out.println(tree.toStringTree(parser));
	}
}

代码中创建了字符输入流对象,用作创建词法分析对象的输入。随后创建词法(ExprLexer)分析对象、符号流对象(CommonTokenStream)、及语法(ExprParser)分析对象。CommonTokenStream将ExprParser与ExprLexer串联在了一起。代码最后打印出分析树。

导入文法

若将所有内容写在一个文件内,则不便于管理,因此可以将文法文件分解。其中一种办法是将文法与词法分开定义。通过lexer grammar定义词法文件,最后在语法文件中用import关键字将词法定义导入。

定义文法文件,该文件内的词法定义已经移入CommonLexerRules.g4文件中,并通过import导入该文件内容。

expr.g4文件

grammar expr;
import CommonLexerRules;
prog : stat+;

stat : expr NEWLINE
     | ID '=' expr NEWLINE
     | NEWLINE
     ;

expr: expr ('*' | '/') expr
	| expr ('+' | '-') expr
	| INT
	| ID
	| '(' expr ')'
	;
CommonLexerRules.g4
lexer grammar CommonLexerRules;

ID : [a-zA-Z]+;
INT : [0-9]+;
NEWLINE: '\r'?'\n';
WS : [\t]+ -> skip;
时间: 2024-11-07 20:39:13

匹配算数表达式语言的相关文章

Spring学习总结(四)——表达式语言 Spring Expression Language

SpEL简介与功能特性 Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言.SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用和基本字符串模板函数. 同很多可用的Java 表达式语言相比,例如OGNL,MVEL和JBoss EL,SpEL的诞生是为了给Spring社区提供一个可以给Spring目录中所有产品提供单一良好支持的表达式语言.其语言特性由Spring目录中的项目需求驱动,包括基于eclipse的SpringSou

spring4-2-bean配置-6-Spring表达式语言SpEL

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL SpEL 为 bean 的属性进行动态赋值提供了便利 通过 SpEL 可以实现: 通过 bean 的 id 对 bean 进行引用 调用方法以及引用对象中的属性 计算表达式的值 正则表达式的匹配 字面量的表示 整数:<property name="count" value="#

Sping表达式语言--SpEL

Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean的属性进行动态赋值提供了便利 通过SpEL可以实现: 通过bean的id对bean进行引用 调用方法以及引用对象中的属性 计算表达式的值 正则表达式的匹配 SpEL:字面量 字面量的表示: -整数:<property name="count" value="#{5}&quo

Spring学习笔记--Spring表达式语言SpEL

Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中.字面值我们可以在<property>元素的value属性中使用#{}界定符将值装配到Bean的属性中. <property name="count" value="#{5}" /> 浮点型数字一样可以出现在SpEL表达式中.

Spring表达式语言SpEL简介

Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有很多特性,比较常用的包括: 1.使用bean的id来引用bean, 下面这个例子就是将卧室这个bean通过SpEL注入到house这个bean的bedroom属性中. <bean id="bedroom" class="go.derek.Bedroom"/> <bean id="house" class=&q

Spring讲解-----------表达式语言

5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式.存取对象图属性.对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义. 表达式语言给静态Java语言增加了动态功能. SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用. 5.1.2  能干什么 表达式语言

Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)

5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式.存取对象图属性.对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义. 表达式语言给静态Java语言增加了动态功能. SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用. 5.1.2  能干什么 表达式语言

开涛spring3(5.1&amp;5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础

5.1  概述 5.1.1  概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式.存取对象图属性.对象方法调用 等等,并且能与Spring功能完美整合,如能用来配置Bean定义. 表达式语言给静态Java语言增加了动态功能. SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用. 5.1.2  能干什么 表达式语言一般是用最简单的形式完成最主

JavaWeb框架_Struts2_(四)-----&gt;表达式语言OGNL

1. 表达式语言OGNL OGNL简介 OGNL基本语法 常量 操作符 OGNL表达式 OGNL基础 OGNL上下文 OGNL值栈 OGNL的访问 2. 具体内容 2.1 OGNL简介 OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression Language, EL).可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. OGNL是一种对java对象的getter和sett