当前位置: 代码迷 >> 综合 >> ANTLR 开发技术
  详细解决方案

ANTLR 开发技术

热度:82   发布时间:2023-12-08 09:29:49.0
暂且简单的记录一下:


环境:

antlr-for-eclipse,即antlride-2.0-rc4版,在eclipse-modeling软件包中使用还需要dltk包支持
ANTLR v3版,包括一个jar文件(包含runtiime和sdk和gunit,而在2.1。7版时,还是分开的4个jar文件)、一个antlr3.jar的ANT任务库文件(也是来自antlr的主页)
eclipse ,分别在ganymede和galileo两个版本的modeling_incubation和SDK上验证通过
Windows 7 / Windows XP+java6u16和Ubuntu 9.10+sun-java6 上分别验证通过


目标1:在elicpse平台上使用ant构建ANTLR

  1. 以Windows 版为例:(Ubuntu版在设置ANTLR_HOME时,可以通过输入ANTLR_HOME=xxx ./eclipse方式启动,不需要修改系统环境变量)
  2. 在系统属性中添加ANTLR_HOME环境变量,如antlr-3.2.jar位于F:workspaceESAlib,则设为:F:workspaceESA
  3. 将antlr3.jar这个ant任务文件复制到eclipse的ant库下,如:F:modelingpluginsorg.apache.ant_1.7.1.v20090120-1145lib
  4. 在eclipse的ANTruntime配置中,单击ANT_HOME,重新定位之,使ANT重新扫描,发现新加入的任务antlr3并添加之。这时候会提示错误,再加入JDK6的tools.jar.
  5. 编写build.xml,形如:
  xml version="1.0" ?>
- < project name =" c " default =" generate " basedir =" . " >
  < property name =" version " value =" 1.00 " />
  < property name =" src " location =" src " />
  < property name =" bin " location =" bin " />
  < property name =" lib " location =" lib " />
  < property name =" build " location =" build " />
  < property name =" dist " location =" dist " />
  < property name =" doc " location =" doc " />
  < property name =" grammar " location =" grammar " />
- < target name =" init " >
-
  < tstamp />
  < mkdir dir =" ${bin}/META-INF " />
-
- < fail message =" Environment variable ANTLR_HOME is not set! " >
- < condition >
- < not >
  < isset property =" envList.ANTLR_HOME " />
  not >
  condition >
  fail >
  target >
-
-
-
  < property environment =" envList " />
-
  < property name =" antlrHome " value =" ${envList.ANTLR_HOME} " />
- < patternset id =" antlr.libs " >
  < include name =" antlr-*.jar " />
  < include name =" stringtemplate-*.jar " />
  < include name =" runtime-*.jar " />
  patternset >
- < path id =" antlr.path " >
- < fileset dir =" ${antlrHome}/lib " casesensitive =" yes " >
  < patternset refid =" antlr.libs " />
  fileset >
  path >
-
  < property name =" report " value =" true " />
  < property name =" multithreaded " value =" true " />
  < property name =" debug " value =" false " />
-
- < macrodef name =" antlr3 " >
  < attribute name =" grammar.name " />
  < attribute name =" package.dir " />
- < sequential >
  < echo message =" antlr ${grammar}/@{grammar.name} " />
- < antlr:antlr3 xmlns:antlr =" antlib:org/apache/tools/ant/antlr " target =" ${grammar}/@{grammar.name} " outputdirectory =" ${src}/@{package.dir} " libdirectory =" ${src}/@{package.dir} " multithreaded =" ${multithreaded} " report =" ${report} " debug =" ${debug} " >
- < classpath >
  < path refid =" antlr.path " />
  classpath >
  < jvmarg value =" -Xmx512M " />
  antlr:antlr3 >
  sequential >
  macrodef >
-
-
- < target name =" generate " depends =" init " description =" using ANTLR to generated *.java " >
  < antlr3 package.dir =" per/chenjw/esa/front/c " grammar.name =" C.g " />
  target >
- < target name =" compile " depends =" init, generate " description =" compile *.java generated by ANTLR. " >
- < javac debug =" true " srcdir =" ${src} " destdir =" ${bin} " listfiles =" Yes " deprecation =" Yes " >
  < compilerarg value =" -Xlint:unchecked -nwarn " />
- < classpath >
  < path refid =" antlr.path " />
  classpath >
  javac >
  target >
-
- < target name =" clean " description =" Removes all generated and disttribution files. " >
  < delete dir =" ${bin} " />
- < delete >
- < fileset dir =" ${dist} " >
  < include name =" *.jar " />
  < exclude name =" *.txt " />
  fileset >
  delete >
  target >
  project >
  1. Alt+X+Q运行之。
FAQ - 常见错误如报错 ant任务不识别,这主要是没有重新扫描ant的lib目录造成的。

PS - TODO - antlr3通过gunit支持更加便捷的测试途径,更详细的ant脚本在这@gmail.com。

目标2:在elicpse平台上使用antlride编写ANTLR语法

  1. 将antlride和ltdk两个的插件包分别放置到eclipse-modeling平台的dropins里面
  2. 启动eclipse后修改ANTLR的配置,指定ANTLR runtime环境,如F:workspaceESA,并制定antlr的输出文件路径。需要注意的是,这里的路径要跟.g文件中header段指定的包名一致。
  3. 在项目如ESA右键中添加ANTLR IDE support,这时候在buiild project操作时,就会包含.g文件的编译。


Suggestion - 为了使antlride和ant方式的输出保持一致,不得不将所有的语法文件生成的包放置到同一个路径下,因此,在.g语法文件中声明的package也必须统一。至于tokens,则不是必须。

进阶:利用ANTLR编写完整的ANSI C解析器

调查

网上有人提供的ANTLR自学经验、资料 ,包含一个tiny-C的语法文件。不过,里面的内容确实很老了,但是一些“老人谈”还是成立的:利用ANTLR编写一个实用的解析器并不比利用Yacc/Lex编写容易太多,作者本人就因为调试语法不成放弃了 。正如下图所示,编译器技术本来就是一件“屠龙技”。


当然,辅助编写语法的东西还是有的,比如上面网址提供了一个 AST树美化输出程序()

 


 

eclipse 上的 JDT中关于Java 解析的原理、实现

 

Flick: The Flexible IDL Compiler Kit

    utah大学提供的IDL 编译器助手库:

Program Database Toolkit

Oregon大学提供的程序数据库工具,架构如下。该工具使用下面EDG公司的解析引擎,它自身的重点在于后端的分析、插桩、组装环节。

 

Thoughts on the Visual C++ Abstract Syntax Tree (AST)

 


Parsing C++

最后,如果看完上面的内容都没有什么收获的话,那么最值得一看就是这篇,作者详细说明了他试图开发一个refactoring C++工具的前因后果,很有深度和概括性。
文中介绍了很多启发性的东西,比如元解析----不是直接打造一个完整的解析器,而是迭代迭构造,思路来自于一篇博士论文。而且这样可以构造出一个比原始C++更大的集合,这可以用来是实现 如嵌入式领域C++语言的扩展。文章提到一个 Edison Design Group公司 ,主页上说的话非常贴近心声,强烈推荐。