Antlr
jazwoo
这个作者很懒,什么都没留下…
展开
-
探索Antlr(Antlr 3.0更新版
简介Antlr(ANother Tool for Language Recognition)是一个工具,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器 (translators)提供了一个基础。通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳 苦。目标如同程序设计语言入门大多采用“Hel转载 2012-06-08 00:03:55 · 780 阅读 · 0 评论 -
Antlr中 options {greedy=false;}
ANTLR词法分析中还可以加入greedy设置项,当greedy=true时当前规则会尽可能的匹配可以匹配的输入。ANTLR中默认情况greedy为true,所以COMMENT: '/*' . * '*/' {$channel=HIDDEN;} ;规则中符号“.”可以匹配“*/”字符,也就是说当遇到“*/”字符时它是匹配“.”还是匹配’*/’出现了二义的情况,前面的例子中已经显示出在这种情况原创 2012-06-09 11:09:31 · 1690 阅读 · 0 评论 -
Antlr生成java 运行环境
下面录入文法文件,运行ANTLRWorks点击“File– New”菜单新建文法文件,在新文件中将前面的文法录入。(我的网站中有本书所有示例源代码,但我建议您还是手工录入一遍。这样您会有更好的学习效果。)录入文法后点击“File – Save” 菜单文件名为“E.g”。然后点击“Generate–GenerateCode”,如果ANTLRWorks提示“The grammar has been s原创 2012-06-09 11:15:34 · 2456 阅读 · 1 评论 -
Antlr 中 fragment词法规则
ANTLR文法中语法规则是在词法规则基础上建立的。但不一定每个词法规则都会被语法规则直接使用。这就象一个类的公有成员和私有成员,公有成员是对外公开的会被外界直接调用。而私有成员不对外公开是由公有成员间接调用的。在词法规则中那些不会被语法规则直接调用的词法规则可以用一个fragment关键字来标识,fragment标识的规则只能为其它词法规则提供基础。grammar TestFragment;原创 2012-06-09 11:10:48 · 7329 阅读 · 0 评论 -
Antlr 中 “.”相关注意
词法定义中有一些与通配符“.”有关的注意事项,下面给出一个示例。d : C ANY PLUS;C : 'c';PLUS : '+';ANY : ( options {greedy=false;} : . ) *;这个文法是要匹配输入字符“c”和“+”,字符“c”与“+”之间可以是一些不确定的内容所以用通配符“.”进行匹配,如前面学到的应该使用greedy=原创 2012-06-09 11:10:30 · 820 阅读 · 0 评论 -
Antlr中skip()方法
有些字符是不属于源程序范畴内的,这些字符在分析过程中应该忽略掉。在ANTLR中可以在词法定义中加入skip();,(如果是C#为目标语言为Skip();)。在规则的定义的之后与表示定义结束的分号之前加入“{skip();}”。例如下面定义了一个跳过空白的词法定义。WS : ( ' ' | '\t' | '\n' | '\r' ) +{skip();} ;空白符号WS中有空格符、制表符、回车原创 2012-06-09 11:07:49 · 2354 阅读 · 0 评论 -
Antlr中嵌入代码 Action
在ANTLR中词法规则和语法规则都是一些上下文无关的规则,它们不能满足语法分析中的一些高级需求或特殊需求。如:我们可能要判断一个表达式中的变量之前是否定义了,没有定义要给出编译错误信息,或者我们要在语法分析时记录一些信息以后使用。这时我们就要在文法中嵌入Actions。Actions就是嵌入文法中的程序代码,它与我们在asp或jsp页面html代码中嵌入VB和java的代码非常类似,在生成代码后a转载 2012-06-09 11:57:30 · 1535 阅读 · 1 评论 -
Antlr中$channel = HIDDEN
有时象注释这样的部分在编译时并不是完全放弃的,如java中在/**….*/的注释形式中可以添加说明最终生成程序的文档,在.NET中使用 /// 注释形式也有类似的功能。也就是说我们在编译代码时忽略这些注释,而在分析生成文档时又要用到这些注释。这样的话就不能使用skip();方法了,skip()方法是抛弃其内容。所以ANTLR中加入了channel属性用来指定当前匹配的内容是属于哪一个频道,分析过程原创 2012-06-09 11:08:50 · 2650 阅读 · 0 评论 -
关于Antlr中报错The following token definitions can never be matched because prior tokens match the same
今天学了点Antlr 的使用 突然发现总报错,但是规则没有错,一直很不理解The following token definitions can never be matched because prior tokens match the same ID : LETTER(LETTER|DIGIT)* {System.out.println(" "+$line+"原创 2012-06-08 00:42:06 · 1079 阅读 · 0 评论 -
Antlr 中 filter=true
我们在分析源代码时有时只想获得其中一部分信息,例如:我们想知道一个java文件中的类的类名,类有哪些方法,方法的参数和返回值及其类型,属性及其类型和此类继承了什么类。但是我们必须写出java的全部文法才可以分析java文件,这很有难度也没有必要。ANTLR中加入了一个叫filter的设置项,filter为布尔类型默认为false。filter为true时词法分析器可以处于一种过滤状态,我们只需定义原创 2012-06-09 11:11:54 · 1224 阅读 · 0 评论