引用
使用 Antlr 处理文本
https://www.ibm.com/developerworks/cn/java/j-lo-antlrtext/index.html
该文章写的非常好,无耐是2011年写的,与现有的antlr版本差别较大,编译不过去,编译过去,也测试不出来正确的结果,以下为用antlr4.2重写的
新项目使用maven和ant构建,需要以下几个文件
- pom.xml
- build.xml
- SqlExtrator.g4语法文件
- SqlExtrator.clj测文件
- Test.java 测试代码
测试方法,
- 先用ant执行compile任务,生成和编译生成的一堆词法解析器和语法解析器代码, 然后执行ant的test任务,解析SqlExtrator.clj测文件里的文本
- 使有Test.java,手动编程调用
使用ant任务的截图,
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx.lang</groupId> <artifactId>fieldTypeUpdate</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>fieldTypeUpdate</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>src/generated/java</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
build.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <project basedir="." default="test" name="mylang"> <property environment="env"/> <property name="debuglevel" value="source,lines,vars"/> <property name="target" value="1.8"/> <property name="source" value="1.8"/> <property name="language" value="sqlExtrator"/> <path id="mylang.classpath"> <pathelement location="lib/antlr-2.7.7.jar"/> <pathelement location="lib/antlr-runtime-3.5.jar"/> <pathelement location="lib/antlr4-4.2.jar"/> <pathelement location="lib/antlr4-annotations-4.2.jar"/> <pathelement location="lib/antlr4-runtime-4.2.jar"/> <pathelement location="lib/junit-3.8.1.jar"/> <pathelement location="lib/org.abego.treelayout.core-1.0.1.jar"/> <pathelement location="lib/ST4-4.0.7.jar"/> <pathelement location="lib/stringtemplate-3.2.1.jar"/> </path> <path id="antlr.classpath"> <pathelement location="antlr-4.7.1-complete.jar"/> </path> <path id="compile.path"> <pathelement location="target/classes"/> </path> <target name="clean"> <delete dir="target"></delete> <delete dir="src/main/java/com/xxx/lang/mylang/${language}"></delete> </target> <target depends="clean" name="gen"> <echo message="generate java from g4 file"/> <java classname="org.antlr.v4.Tool" fork="yes" failonerror="true"> <classpath refid="mylang.classpath"/> <arg value="src/main/resources/SqlExtrator.g4"/> <arg line="-package "/> <arg value="com.xxx.lang.mylang.${language}"/> <arg line="-o "/> <arg value="src/main/java/com/xxx/lang/mylang/${language}/"/> <arg value="-visitor"/> <arg value="-no-listener"/> <arg value="-encoding"/> <arg value="UTF-8"/> </java> </target> <target depends="gen" name="compile"> <echo message="compile generate java file"/> <mkdir dir="target/classes"/> <javac debug="true" debuglevel="${debuglevel}" destdir="target/classes" includeantruntime="false" source="${source}" target="${target}"> <src path="src/main/java"/> <compilerarg line="-encoding UTF-8 "/> <classpath refid="mylang.classpath"/> </javac> </target> <target name="test" description="Run the main class" > <java classname="org.antlr.v4.gui.TestRig" fork="yes" failonerror="true"> <classpath refid="antlr.classpath"/> <classpath refid="compile.path"/> <sysproperty key="file.encoding" value="UTF-8"/> <arg value="com.xxx.lang.mylang.${language}.SqlExtrator"></arg> <arg value="sql"></arg> <arg value="-gui"></arg> <arg value="src/test/java/SqlExtrator.clj"></arg> </java> </target> </project>
SqlExtrator.g4 语法文件 该语法文件,仅可以识别词法规定的字符,词法外的字符将会报错
grammar SqlExtrator; WS : (' ' |'\t' |'\r' |'\n' )+ ; INT: '0'..'9' + ; ID : ('a'..'z' |'A'..'Z' |'_' ) ('a'..'z' |'A'..'Z' |'_' |'0'..'9' )*; EOL: ('\n' | '\r' | '\r\n')*; SUCCESS:'DB20000I The SQL command completed successfully.'EOL ; SqlFrg :'INSERT INTO SYSA.' ID '(' ID ',' ID ')' WS 'VALUES' '(\'' ID '\',\'' INT '\')'EOL ; txt:mysql=SqlFrg {System.out.println($mysql.text);} SUCCESS; sql:(txt)+;
第二个版本的语法,添加了:
FILTER: .? -> skip;
仅这一行,这行代码,使用正则的非贪婪匹配规则,
引用
Wildcard Operator and Nongreedy Subrules
正则表达式贪婪与非贪婪模式
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab.*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。
2.编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个
grammar SqlExtrator; SqlFrg :'INSERT INTO SYSA.' ID '(' ID ',' ID ')' WS 'VALUES' '(\'' ID '\',\'' INT '\')' ; fragment WS : (' ' |'\t' |'\r' |'\n' )+ ; fragment ID: ('a'..'z' |'A'..'Z' |'_' ) ('a'..'z' |'A'..'Z' |'_' |'0'..'9' )*; fragment INT: '0'..'9' + ; fragment EOL: '\n' | '\r' | '\r\n'; SUCCESS:'DB20000I The SQL command completed successfully.' ; all: (SqlFrg SUCCESS {System.out.println($SqlFrg.text);})+ ; FILTER: .? -> skip;
SqlExtrator.clj 测试文件
INSERT INTO SYSA.IF_EMPUSRRLA(USRNUM,EMPNUM) VALUES('U037508','275159') DB20000I The SQL command completed successfully. document.write(v+' test is '+result+'</br>');//该行代码在第一个版本的语法中会报错 INSERT INTO SYSA.IF_USRSTNRLA(USRNUM,STNNUM) VALUES('U037710','00026') DB20000I The SQL command completed successfully.
Test.java 测试代码
public class Test { public static void main(String[] args) { try { String filename = "D:\\workplace\\fieldTypeUpdate\\src\\test\\java\\SqlExtrator.clj"; InputStream in = new FileInputStream(filename); ANTLRInputStream input = new ANTLRInputStream(in); SqlExtratorLexer lexer = new SqlExtratorLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); SqlExtratorParser parser = new SqlExtratorParser(tokens); parser.sql(); System.out.println("done!"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
测试结果控制台输出:
引用
INSERT INTO SYSA.IF_EMPUSRRLA(USRNUM,EMPNUM) VALUES('U037508','275159')
INSERT INTO SYSA.IF_USRSTNRLA(USRNUM,STNNUM) VALUES('U037710','00026')
done!
发表评论
-
charles4.2下载与破解方法以及配置https
2020-02-26 09:03 2有两个抓包工具 一个是fidder,一个是charles,两个 ... -
序列号批量生成算法
2019-12-05 14:11 0业务处理过程当中,经常需要生成订单号、序列号等,简单的可 ... -
解决maven-metadata.xml文件下载卡死问题
2019-04-11 14:02 3975http://192.168.1.110:8081/nexus ... -
rsync备份和删除指定文件
2018-01-02 10:23 2044文件异地备份时,需要将本地文件合并到服务器上,且不能删除服务器 ... -
javaLocale格式化日期和数字
2017-08-25 09:26 865public static void main(Strin ... -
centos6 tomcat 启动脚本 tomcat服务
2017-08-23 11:24 1438系统自动启动tomcat 复制该脚本到/etc/init.d/ ... -
win7 命令行改IP和DNS
2016-12-21 18:35 732使用管理员权限运行CMD //改DNS netsh ... -
jenkins中集成sonar,使用findbug、pmd、checkstyle提升代码质量
2016-09-29 14:58 6166实际上jenkins单独也 ... -
jenkins 集成sonar
2016-09-18 10:14 0jenkins集成sonar可以从插件中心直接更新安装 son ... -
activeMQ5.14权限配置
2016-08-17 13:47 2669activeMQ默认的消息队列没有用户名和密码,可以直接通过T ... -
solaris 使用解压版的jdk
2016-07-27 15:17 761solaris上配置jdk其实也很简单 由于solaris有 ... -
solaris tomcat开机启动
2016-07-27 16:17 618创建文件夹/var/svc/manifes ... -
HibernateTemplate Vs HibernateDaoSupport Vs Direct Hibernate Access
2016-07-26 11:07 732http://forum.spring.io/forum/sp ... -
spring mvc mybatis will not be managed by Spring
2016-07-20 17:30 9876项目运行时发现事务提交不完整,回滚时只能回滚一半。 系统配置 ... -
java里判断一点是否在某个区域
2016-06-03 17:47 1830import java.awt.geom.Path2D ... -
12306的技术升级
2016-04-20 16:17 1026升级的核心是余票查询的升级,余票查询使用存储过程,sybase ... -
工作流的123
2016-04-20 12:58 571三分钟了解Activity工作流 工作流一般会给开发人员提供流 ... -
sping mvc 使用@Value注解为controller注入值
2016-04-17 17:39 10830spring mvc 里有两个配置文件, 第一个,为sprin ... -
googleapis.com域名访问慢的解决办法
2016-04-13 12:09 9681、安装火狐 2、安装插件ReplaceGoogleCDN -
ehcache-web缓存的使用和清除
2016-03-15 11:37 10510引入jar包 <!--ehcache缓存--> ...
相关推荐
利用Antlr生成C++描述的分析程序.pdf ...使用 Antlr 处理文本.htm 使用 Antlr 开发领域语言.htm 强悍的ANTLR Lexer.htm a little madness » Blog Archive » ANTLR By Example Part 1 The Language.htm
5. **使用ANTLR生成的解析器**:讲解如何使用ANTLR生成的解析器处理输入的文本,包括如何调试解析过程,处理解析错误等。 6. **抽象语法树(AST)**:阐述AST的概念,它是解析过程的结果,表示了输入文本的结构,...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或...通过学习和使用ANTLR,你可以轻松处理自定义的文本格式,构建自己的编程语言,或者解析任何符合特定规则的数据。
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。在SQL解析领域,ANTLR被广泛应用于构建能够理解SQL语句的解析器。这个项目的目标是...
它能够读取、处理、执行或翻译结构化文本或二进制文件。在本项目“基于ANTLR4的CMM语言编译器”中,开发人员使用ANTLR4来创建了一个针对CMM(可能是自定义中间表示或特定编程语言)的编译器。 编译器是计算机科学中...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR4是ANTLR项目的最新版本,提供了许多改进...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR生成的解析器能够处理各种输入源,包括...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛用于构建语言、工具和框架,包括SQL、JavaScript、Python、Java、C++等。...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR可以生成Java、C#、Python、JavaScript等...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR可以生成Java、C#、Python、JavaScript等...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...
ANTLR 4是一款强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,从脚本语言和配置文件到DSL(领域特定语言)和嵌入式语法。ANTLR 4生成的解析器基于LL(*)...
ANTLR4 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL、Java、C#、JavaScript、Python等。在本项目中,"Antlr4 C++ 计算器"是一个基于...
ANTLR 4是一款强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。从标题“Definitive ANTLR 4 Reference”和描述“ANTLR 4的权威参考”可以看出,这本书...