Antlr简介与中文手册范本
ANTLR入门详细教程
ANTLR入门详细教程ANTLR(Another Tool for Language Recognition)是一种用于构建语言识别工具的强大工具。
它可以用来创建解析器、编译器、翻译器等。
ANTLR使用LL(*)解析算法,这使其能够处理包括左递归的复杂语法。
本教程将向您介绍ANTLR的基本概念、安装方法和使用示例。
一、ANTLR简介二、安装ANTLR2. 安装Java:ANTLR是基于Java的,所以您需要先安装Java。
3. 设置ANTLR环境变量:将ANTLR的安装目录(例如:C:\antlr4)添加到系统的PATH环境变量中。
4. 安装ANTLR插件:如果您使用的是IDE(如IntelliJ IDEA或Eclipse),可以安装ANTLR插件以获得更好的开发体验。
三、使用ANTLR1. 创建语法规范文件:创建一个以.g4为扩展名的文件,例如Hello.g4、在这个文件中定义词法规则和语法规则。
以下是一个简单的例子:```grammar Hello;r : 'hello' ID ';' ;ID:[a-z]+;WS : [ \t\r\n]+ -> skip ;```2. 生成解析器代码:打开命令行终端,导航到Hello.g4所在的目录,并运行以下命令:```antlr4 Hello.g4```这将生成HelloListener.java、HelloBaseListener.java、HelloLexer.java和HelloParser.java等文件。
3. 编写解析器代码:创建一个Java类,使用生成的解析器和监听器来解析源代码。
以下是一个简单的示例:```javapublic class HelloWorldpublic static void main(String[] args) throws ExceptionString sourceCode = "hello world;";HelloLexer lexer = new HelloLexer(input);HelloParser parser = new HelloParser(tokens);ParseTree tree = parser.r(; // 解析源代码ParseTreeWalker walker = new ParseTreeWalker(;HelloListener listener = new HelloBaseListener(;walker.walk(listener, tree); // 遍历解析树}```4. 运行解析器:在命令行中编译并运行上面的Java类。
Antlr简介及中文手册
Antlr简介06通讯软件06382027 毅本文主要介绍了什么是ANTLR,以及ANTLR的使用,其中ANTLR的使用包括了ANTLR的安装及使用,ANTLR语法文件解析,ANTLR规则(RULE)解析,ANTLR语法实例—SensorSQL,ANTLR Studio及其功能介绍等。
Antlr(ANother Tool for Language Recognition)是一个工具,前身是PCCTS,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器(translators)提供了一个基础。
通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳苦。
它是这样的一种工具,它可以接受文法语言描述,并能产生识别这些语言的语句的程序。
作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。
ANTLR知道怎样去生成识别程序,语言包括Java,C++,C#和不久的Python。
ANTLR知道怎样构建识别程序,这些程序可以对以下三种不同的输入应用文法结构:(i) 字符流, (ii) 记号流,和(iii)两维的树结构。
很自然的它们分别与词法分析程序(lexers,以下简称lexer),语言解析程序和树遍历程序向匹配。
这个用于定义这些语法的元语言,在所有情况下几乎一样的。
一旦你对ANTLR和类似工具比较顺手,你会开始以一种新的目光来看编程。
许多任务强烈需要语言解决方案,而不是采用传统编程语言的做法。
比如,这些过程的注解都是用特伦斯标记语言写的。
而ANTLR 则能来将文本(含一些额外的东西和转换)转化为HTML,PDF或者其他那些生成程序的文件格式。
最后,ANTLR只是一件工具,仅仅这些。
虽然它能通过将容易理解的乏味部分自动化来帮助你创建软件,但却不能企图让你指定整个编译器。
Antlr详细教程(入门正本)
一、 Antlr 的主要类:Antlr 中有主要类有两种(其实还有一种 TreeLexer )Lexer:文法分析器类。
主要用于把读入的字节流根据规则分段。
既把长面条根据你要的尺寸切成一段一段:)并不对其作任何修改。
Parser:解析器类。
主要用于处理经过 Lexer 处理后的各段。
一些具体的操作都在这里。
二、 Antlr 文法文件形式:Antlr 文件是 *.g 形式,即以 g 为后缀名。
例如: t.gclass P extends Parser;startRule: n:NAME{System.out.println("Hi there, "+n.getText());};class L extends Lexer;// one-or-more letters followed by a newlineNAME:('a'……'z'|'A'……'Z' )+ NEWLINE;NEWLINE: '\r' '\n' // DOS| '\n' // UNIX;具体成分分析:1 、总体结构Class P extends ParserClass L extends Lexer两行同 JAVA 继承一样, P 继承 Parser 类; L 继承 Lexer 类。
每个 .g 文件只能各有一个。
2 、 Lexer 类分析一般按照类型名:匹配的具体规则;的形式构成。
是分隔字节流的依据。
同时可以看到里面可以互相引用。
如本例中的类型名 NEWLINE 出现在 NEW 的匹配规则中。
3 、 Parser 类分析一般按照起始规则名:规则实例名:类型名或规则名{Java 语句……; };……的形式构成。
起始规则名:任意。
规则实例名:就象 Java 中“ String s ;”的 s 一样。
规则实例名用于在之后的 JAVA 语句中调用。
java antlr语法
Java ANTLR语法1. 介绍在Java编程中,ANTLR(ANother Tool for Language Recognition)是一种非常有用的工具,用于构建语法分析器。
它可以根据给定的语法规则生成解析器和词法分析器,并且可以应用于生成代码、进行语法检查、执行语义分析等多个领域。
2. ANTLR的基本原理ANTLR的基本原理是使用上下文无关文法(Context-Free Grammar,简称CFG)描述语言的语法规则,并根据这些规则生成解析器和词法分析器。
ANTLR支持LL()语法和LR()语法两种类型,并可以通过语法规则的定义灵活地生成不同类型的解析器。
2.1 上下文无关文法上下文无关文法是一种形式化的语法规范,用于描述一类形式语言的句法结构。
它包含四个部分:终结符(Terminals)、非终结符(Non-terminals)、产生式规则(Productions)和起始符(Start symbol)。
ANTLR使用扩展的巴科斯范式(Extended Backus-Naur Form,简称EBNF)来描述上下文无关文法。
2.2 语法规则定义在ANTLR中,语法规则由标识符、参数列表、返回类型和规则体四个部分组成。
语法规则的定义基本形式如下:ruleName [返回类型] [参数列表]: 执行体;其中,ruleName表示规则名称,返回类型和参数列表可选。
执行体是规则的具体实现,用于描述规则的语义。
2.3 解析器和词法分析器的生成在ANTLR中,通过定义完整的语法规则,并使用ANTLR工具根据这些规则生成解析器和词法分析器。
生成的解析器和词法分析器可以直接应用于源代码的解析和语法检查。
3. ANTLR语法规则示例下面是一个简单的ANTLR语法规则示例,用于解析简单的数学表达式:grammar MathExpression;// 语法规则start : expression EOF;expression : expression op=('*' | '/')| expression op=('+' | '-')| '(' expression ')'| NUMBER;// 词法规则NUMBER : DIGIT+;WS : [ \t\n\r]+ -> skip;// 辅助规则fragment DIGIT : [0-9];4. ANTLR语法规则说明上述示例中,定义了一个名为MathExpression的语法规则,用于解析简单的数学表达式。
ANTLR:文法分析利器(Ⅰ)
ANTLR:文法分析利器(Ⅰ)ANTLR: 文法分析利器(Ⅰ)October 11th, 2006 | Category: Open Source, Software大学时, 写过不少需要文法分析的Project, 如MiniSQL的SQL语法, 简易计算器等. 从计算理论的角度来说, 相对于正则的孱弱. DFA对于文法的表达能力是简单强大的. 因此, 也就有了DFA的文法分析工具. 几乎每一本编译原理的书上, 都会提到Lex/Yacc这一对词法语法分析工具(如果没有, 就扔掉它, -,-). 30几年的历史, 也证明了Lex/Yacc的强大. 然而, 也正因为其历史, 使之的OO支持上存在着很大问题. 毕竟, C 才是其母语. 所以, 新的工具ANTLR就自然地诞生了.首先来介绍一下吧.What is ANTLR?ANTLR, ANother Tool for Language Recognition, (formerly PCCTS) is a language tool that provides a framework for constructing recognizers, compilers, and translators from grammatical descriptions containing Java, C#, C++, or Python actions.究其源, ANTLR只是一个Java工具, 一个文法分析工具, 它提供了把相应rule生成包括Java,C++等语言的支持.Q: How to use?A: $java -cp $(antlr-jar-path) antlr.T ool example.g然后就生成了相应的文件了.相比于Lex/Yacc, ANTLR多了以下优点(个人使用感觉).1.面向对象的设计和面对对象的使用. OO的过程.2.LL(k)语法. 比LALR, 更加的强大. 同时也没有了烦人的shift-reduce, reduce-reduce之类的语法冲突错误.3.Error Handling. ANTLR是完全exception-driven的. 错误处理机制灵活健全. exception的最小粒度能得到具体token, 方便你在语法解析时控制系统的错误处理.4.生成后代码的可读性. 全部封装在对应的class里面, 便于阅读. 在语法的parser上, ANTLR使用了直观的switch/case来匹配token(而不是Yacc的parser table), 进而匹配这个规则, 类似于手动写一个DFA. 同时, 由于编译器对于switch的优化, 效率上并没多大影响.5.对语言的支持. 对于一个rule, 你可以方便的加入一段代码. 同时, 你可以很方便在规则之外加入类的成员变量, 类的成员函数(对于封装很有好处)以及全局的变量和函数等.6.生成后的代码使用简单. Simple Example: ExampleLexer lexer(cin); ExampleParser paser(lexer); parser.expr(); . 同时也可见, 易于封装.7.可以定义rule的返回值, rule的参数. 在rule relation的处理上更加地强大.8.提供了丰富的built-in function.9.Unicode的支持. 你几乎不需要做额外的工作.在官网里面, 还特别提到了一点:ANTLR provides excellent support for tree construction, tree walking, and translation.即对TreeParser和AST的支持. 不过由于我的语法很少需要用到TreeWalker, 没多少体会.ok. 先介绍到这吧. 后续将给出具体的example.强烈推荐一下.官方网址: /maillist:************************4 Comments so far1.J ack October 11th, 2006 2:43 am不知道现在大学是否还在使用yacc/lex, 还是类似javacc/antrl这类比较oo的文法分析器。
antlr stringtemplate 用法
antlr stringtemplate 用法摘要:1.ANTLR 简介2.StringTemplate 的作用和特点3.ANTLR StringTemplate 的基本语法4.ANTLR StringTemplate 的实际应用5.总结正文:1.ANTLR 简介ANTLR(Another Tool for Language Recognition)是一款强大的解析生成工具,主要用于处理结构化文本数据。
它可以根据用户定义的语法规则生成解析器、词法分析器和树遍历器等。
ANTLR 广泛应用于各种编译器、解释器和数据处理领域。
2.StringTemplate 的作用和特点StringTemplate 是ANTLR 的一个功能强大的子项目,它允许用户在解析过程中动态生成字符串。
StringTemplate 具有以下特点:- 可以在解析树遍历过程中生成字符串,支持复杂的字符串操作和表达式。
- 支持嵌套的模板定义,可以创建多层次的模板结构。
- 可以通过宏定义和参数化来实现代码重用和灵活性。
3.ANTLR StringTemplate 的基本语法ANTLR StringTemplate 的基本语法如下:- rule:定义一个StringTemplate 规则,由LT、GT 和行动代码组成。
LT:表示词法分析器生成的词法单元。
GT:表示从词法分析器生成的词法单元到解析树的转换。
行动代码:表示在解析树遍历过程中执行的操作。
example:rule MyTemplate( MyTemplate ( GT MyTemplate ) ){// 解析器执行的代码}4.ANTLR StringTemplate 的实际应用以一个简单的示例来说明如何使用ANTLR StringTemplate。
首先,定义一个简单的语法规则:```grammar MyGrammar;expression: multiplication ((PLUS | MINUS) multiplication)*;multiplication: atom (MULT atom)*;atom: INT| LPAREN expression RPAREN;INT : [0-9]+ ;LPAREN : "(" ;RPAREN : ")" ;MULT : "*" ;PLUS : "+" ;MINUS : "-" ;WS : [ t]+ -> skip ;```然后,使用ANTLR StringTemplate 生成解析器和词法分析器:```javaimport org.antlr.v4.runtime.*;import org.antlr.v4.runtime.tree.ParseTree;public class Main {public static void main(String[] args) throws IOException {// 创建词法分析器和解析器MyGrammarLexer lexer = newMyGrammarLexer(CharStreams.fromString("1+2*3"));MyGrammarParser parser = new MyGrammarParser(newCommonTokenStream(lexer));// 解析表达式ParseTree tree = parser.expression();// 使用StringTemplate 生成字符串StringTemplate template = new StringTemplate("expression");CommonTokenStream tokenStream = new CommonTokenStream(lexer);String result = template.expand(tokenStream, tree);System.out.println(result); // 输出"1 + 2 * 3"}}```5.总结ANTLR StringTemplate 提供了一种强大的字符串生成功能,可以在解析过程中动态生成字符串。
java antlr4接口说明
一、概述Java ANTLR4 接口是一个强大的工具,用于对输入的文本进行解析和语法分析。
它提供了丰富的功能和灵活的接口,使开发者能够轻松地构建自己的语法分析器和解析器。
二、ANTLR 表达式ANTLR 表达式是一种特殊的文本格式,用于描述语法规则和词法分析规则。
它使用类似于正则表达式的语法来描述文本的结构和语法。
三、ANTLR4 工作流程1. 词法分析ANTLR4 首先对输入的文本进行词法分析,将文本中的字符序列转换成一个个的 token,这些 token 是文本的基本构成单元,用于后续的语法分析。
2. 语法分析在词法分析完成之后,ANTLR4 会根据预先定义的语法规则对 token 进行语法分析,构建文本的语法树。
语法树表示了文本的语法结构,可以用于后续的语义分析和生成目标代码。
四、ANTLR4 接口使用1. 编写语法规则开发者需要编写自己的语法规则文件,描述输入文本的语法结构。
2. 生成解析器利用ANTLR4 提供的命令行工具,将语法规则文件编译成解析器代码。
3. 编写解析器代码开发者可以基于生成的解析器代码,编写自己的程序逻辑,调用解析器进行文本的解析和分析。
4. 解析输入文本在使用接口时,开发者可以将输入的文本传递给解析器,进行词法分析和语法分析。
五、ANTLR4 接口功能1. 支持自定义语法规则开发者可以根据自己的需求,编写自定义的语法规则文件,描述输入文本的语法结构。
2. 生成目标代码ANTLR4 提供了丰富的目标语言支持,包括 Java、C#、Python 等,开发者可以将语法规则文件编译成相应的目标代码。
3. 灵活的接口ANTLR4 提供了丰富的 API 和接口,开发者可以灵活地使用接口,满足各种语法分析需求。
4. 高性能ANTLR4 提供了高效的词法分析和语法分析算法,能够快速地处理大规模的输入文本。
六、总结Java ANTLR4 接口是一个功能强大,灵活多样的语法分析工具,能够帮助开发者轻松地构建自己的语法分析器和解析器。
antlr的language
ANTLR(ANother Tool for Language Recognition)是一个强大的语言识别工具,它可以帮助开发者轻松地构建和分析语言识别器。
ANTLR支持多种编程语言,包括Java、C#、Python和JavaScript 等,因此具有广泛的应用范围。
1. ANTLR的起源ANTLR最早由美国计算机科学家Terence Parr于1989年开发,旨在帮助开发者设计和实现程序语言处理器。
经过多年的发展,ANTLR已经成为当前最受欢迎的语言识别工具之一。
2. ANTLR的特点ANTLR具有许多独特的特点,使其成为开发者首选的语言识别工具之一:1)易于使用:ANTLR提供了简洁的语法,开发者可以通过使用ANTLR自带的语法规则轻松地构建语言识别器。
2)跨评台性:ANTLR支持多种编程语言,使得开发者可以在不同的评台上使用ANTLR来构建和分析语言识别器。
3)丰富的功能:ANTLR具有丰富的功能,包括词法分析、语法分析、语法树构建等,可以满足不同场景下的需求。
4)强大的性能:ANTLR在语言识别的性能方面表现优异,可以处理大规模的语言识别任务。
3. ANTLR的应用领域ANTLR被广泛应用于各种领域,包括编程语言设计、编译器实现、代码分析等。
其中,ANTLR在编程语言设计和编译器实现方面有着突出的应用:1)编程语言设计:开发者可以使用ANTLR来设计和实现自定义的编程语言,从而满足特定场景下的编程需求。
2)编译器实现:ANTLR可以帮助开发者实现高效的编译器,将源代码转换为目标代码。
4. ANTLR的工作原理ANTLR的工作原理可以分为以下几个步骤:1)词法分析:ANTLR首先对输入的源代码进行词法分析,将源代码分解为一个个的词法单元,如关键字、标识符、常量等。
2)语法分析:在词法分析的基础上,ANTLR进行语法分析,将词法单元按照语法规则组织成语法树。
3)语法树构建:ANTLR将语法分析得到的抽象语法树构建起来,使其能够更加方便地进行后续处理。
antlr g4语法
antlr g4语法摘要:1.简介2.ANTLR G4 简介3.ANTLR G4 语法设计4.ANTLR G4 语法应用5.总结正文:1.简介ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,可以用于处理结构化文本数据。
ANTLR G4 是ANTLR 工具的第四个主要版本,提供了许多新功能和改进。
在本文中,我们将重点介绍ANTLR G4 的语法设计。
2.ANTLR G4 简介ANTLR G4 使用EBNF(扩展巴科斯范式)语法描述语言,并支持自适应语法。
这意味着ANTLR G4 可以根据输入数据自动调整其语法规则,从而提高解析性能。
ANTLR G4 还支持多种目标编程语言,如Java、C#、Python 等,方便开发者根据需求选择。
3.ANTLR G4 语法设计ANTLR G4 的语法设计主要包括以下几个方面:- 语法文件:使用EBNF 语法描述语言编写语法规则,并保存在单独的文件中。
- 词法规则:定义输入文本中的字符序列,例如关键字、标识符、操作符等。
- 语法规则:定义结构化文本数据的结构,例如文法、程序段、注释等。
- 语义动作:为每个语法规则定义一个或多个语义动作,用于处理输入数据。
4.ANTLR G4 语法应用ANTLR G4 可以广泛应用于各种场景,如:- 编译器:将源代码转换为目标编程语言,例如C 语言编译器、JavaScript 解释器等。
- 解释器:直接解释执行源代码,例如Python 解释器、Ruby 解释器等。
- 数据解析:将结构化文本数据转换为程序可以处理的数据结构,例如XML 解析器、JSON 解析器等。
5.总结ANTLR G4 是一种强大的解析器生成器,通过EBNF 语法描述语言和自适应语法,为开发者提供了方便、高效的语法设计方案。
ANTLR G4 可以应用于多种场景,为各种项目提供支持。
ANTLR简介
ANTLR简介《ANTLR 4权威指南》由机械⼯业出版社出版,有兴趣的读者推荐购买阅读。
本专题⼤多内容来源于我读《ANTLR 4权威指南》的随⼿笔记以及个⼈实践,仅供参考学习,请勿⽤于任何商业⽤途,后果⾃负,如涉及侵权或有错误之处,及时。
另外参考:《ANTLR 4 权威指南》学习笔记:《ANTLR 4 权威指南》源代码:序⽂ANTLR能够解决别的⼯具⽆法解决的问题。
软件改变了世界。
数⼗年来,信息化的浪潮在全球颠覆着⼀个⼜⼀个的⾏业。
然⽽,整个世界的信息化程度还远未达到合理的⾼度,还有⼤量传统⾏业的⽣产⼒可以被信息化所解放。
在这种看似⽭盾的情形背后存在着⼀条鸿沟:⼤量从事传统⾏业的⼈员拥有在本⾏业中⽆与伦⽐的业务知识和经验,却苦于跟不上现代软件发展的脚步。
解决这个问题的根本⽅法就是DSL(Domain specific Language),让传统⾏业的⼈员能够⽤严谨的⽅式与计算机对话。
其实,本质上任何编程语⾔都是⼀种DSL,殊途同归。
实现DSL的主要困难就在编译器前端。
幸运的是,ANTLR的出现使这个过程变得易如反掌。
ANTLR能够根据⽤户定义的语法⽂件⾃动⽣成词法分析器和语法分析器,并将输⼊⽂本处理为(可视化的)语法分析树。
这⼀切都是⾃动进⾏的, 所需的仅仅是⼀份描述该语⾔的语法⽂件。
ANTLR⾃动⽣成的编译器前端⾼效、准确,能够将开发者从繁杂的编译理论中解放岀来,集中精⼒处理⾃⼰的业务逻辑。
ANTLR4引⼊的⾃动语法分析树创建与遍历机制,极⼤地提⾼了语⾔识别程序的开发效率。
本专题适⽤于对语⾔识别程序的开发感兴趣的⼯程师。
不过,假如你现在没有这样的需求,仍然建议你阅读,因为它能够开拓你的眼界,加深对编程语⾔的理解。
应⽤ANTLR被⼴泛⽤于学术界、⼯业界:twitter搜索⽤ANTLR做语法分析Hadoop中的是基于ANTLR的Netbeas IDE⽤ANTLR解析C++Hibernate⽤ANTLR处理HQL语⾔使⽤ANTLR4将SQL语句解析成语法树,进⽽⽣成逻辑计划LogicPlan......个⼈可以⽤ANTLR创建使⽤⼯具,例如:配置⽂件读取器遗留代码转换器JSON 解析器......ANTLR可根据语法⾃动创建语法分析器,⼤⼤降低了开发语⾔识别应⽤的难度。
Antlr简介及中文手册
Antlr简介06通讯软件 06382027 郑毅本文主要介绍了什么是ANTLR,以及ANTLR的使用,其中ANTLR的使用包括了ANTLR的安装及使用,ANTLR语法文件解析,ANTLR规则(RULE)解析,ANTLR语法实例—SensorSQL,ANTLR Studio及其功能介绍等。
Antlr(ANother Tool for Language Recognition)是一个工具,前身是 PCCTS,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器(translators)提供了一个基础。
通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳苦。
它是这样的一种工具,它可以接受文法语言描述,并能产生识别这些语言的语句的程序。
作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。
ANTLR知道怎样去生成识别程序,语言包括Java,C++,C#和不久的Python。
ANTLR知道怎样构建识别程序,这些程序可以对以下三种不同的输入应用文法结构:(i) 字符流, (ii) 记号流,和(iii)两维的树结构。
很自然的它们分别与词法分析程序(lexers,以下简称lexer),语言解析程序和树遍历程序向匹配。
这个用于定义这些语法的元语言,在所有情况下几乎一样的。
一旦你对ANTLR和类似工具比较顺手,你会开始以一种新的目光来看编程。
许多任务强烈需要语言解决方案,而不是采用传统编程语言的做法。
比如,这些过程的注解都是用特伦斯标记语言写的。
而ANTLR 则能来将文本(内含一些额外的东西和转换)转化为HTML,PDF或者其他那些生成程序的文件格式。
最后,ANTLR只是一件工具,仅仅这些。
虽然它能通过将容易理解的乏味部分自动化来帮助你创建软件,但却不能企图让你指定整个编译器。
ANTLR 介绍
ANTLR 介绍ANTLR 介绍Posted by Nicholas Ding on 四月17th, 2006ANTLR 介绍作者:Terence Parr译者:Nicholas @ NirvanaStudio原文出处:/~parrt/course/652/lectures/antlr.ht ml介绍自1980年以来我手工编写了很多识别程序(recognizer)和翻译程序(translator)但最终我感到很恶心并且尝试将这个过程自动化:来源于我的座右铭:"Why program by hand in five days what you can spend five years of your life automating."手工编写过很多程序之后你就可以发现一些共性,并且这些共性可以合理地格式化并且自动生成。
我当时对yacc不是很熟悉但是想要一些东西去代替我原本需要手工编码的工作。
ANTLR就是这个最终的结果(实际上原来它叫做PCCTS)。
我现在已经为之工作了十年了。
ANTLR, ANother Tool for Language Recognition, 是一个可以接受含有语法描述的语言描述符并且生成程序能够识别这些语言所产生的句子。
作为一个翻译程序的一部分,你可以给你的语法附上简单的操作符和行为并且告诉ANTLR如何构造AST并且如何输出它们。
ANTLR知道如何使用Java,C++,C#或者Python来生成它们。
ANTLR知道如何构造识别程序并且将语法结构应用到三种不同的输入上:(i) 字符流,(ii) 标记(token)流,(iii) 二维树结构。
本质上这些对应了词法分析器(Lexer),解析器(Parser)和Tree Walker。
用于制定这些语法(Grammar)的句法(Syntax),被称为meta-language,在所有情况下是独立的。
一旦你适应了ANTLR或者相应的工具,你将会以另一种眼光来看待编程。
-ANTLR参考手册
-ANTLR参考手册献给项目领导和最高导师Terence Parr旧金山大学支持站点Your View of the Java Universe初期代码获益于John Lilly, Empathy SoftwareC++ 代码生成器Peter Wells和Ric KlarenC# 代码生成Micheal Jordan, Kunle Odutola 和Anthony Oguntimehin。
Python's方面的扩展来自于Wolfgang Häfelinger and Marq Kole基础软件支撑来自Perforce:世界上最好的源码控制系统之一感谢以下朋友贡献了他们的聪明才智Loring CraymerMonty ZukowskiJim CokerScott StanchfieldJohn MitchellChapman Flack (UNICODE, 流部分)关于Eclipse和NetBeans 方面的源码改进来自于Marco van Meegen and Brian SmithANTLR 2.7.5版2004年12月22日目录前言ANTLR是什么 (5)第1章ANTLR规范: 元语言(Meta-Language) (6)1.1元语言词汇表(Meta-Language Vocabulary) (6)1.2 Header段(Header Section) (12)1.3语法分析类的定义(Paser Class Definitions) (12)1.4词法分析类定义(Lexcal Analyzer Class Definitions) (13)1.5树分析类定义(Tree-parser Class Definitions) (14)1.6 选项段(Option Section) (14)1.7 记号段(Tokens Section) (14)1.8语法继承(Grammar Inheritance) (16)1.9规则定义(Rule Definitions ) (16)1.10原子的产生式元素(Atomic Production Elements) (19)1.11简单的产生式元素(Simple Production Elements) (21)1.12产生式元素操作符(Production Element Operators) (22)1.13记号类 (24)1.14谓词 (24)1.15元素标签 (25)1.16扩展的BNF规则元素(EBNF Rule Elements) (25)1.17语义动作的解释(Interpretation Of Semantic Actions) (26)1.18 语义谓词(Semantic Predicates) (26)1.19语法谓词(Syntactic Predicates) (28)1.19.1固定深度的超前预测分析和语法谓词(Fixed d epth lookahead and syntacticpredicates) (29)1.20ANTLR元语言文法(ANTLR-meta Lanuage Grammar) (30)第2章使用ANTLR进行词法分析(Lexical Analysis with ANTLR) (30)2.1词法规则(Lexical Rules) (31)2.1.1跳过字符(Skipping characters) (32)2.1.2词法分析规则的区别(Distinguishing between lexer rules) (32)2.1.3返回值(Return values) (33)2.2含谓词的LL(k)词法分析 (34)2.3关键字和字面值(Keywords and literals) (37)2.4常见的前缀(Common prefixes) (37)2.5记号定义文件(Token definition files) (38)2.6字符类(Character classes) (38)2.7记号属性(Token Attributes) (38)2.8词法超前分析和记号结束符(Lexical lookahead and the end-of-token symbol) (38)2.9扫描二进制文件(Scanning Binary Files) (43)第3章ANTLR的树分析器 (44)3.1 什么是树分析器? (45)3.2 可以分析什么类型的树? (45)3.3 树的语法规则 (46)3.4 句法断言 (47)3.6 一个树遍历器的例子 (48)3.7 翻译 (51)3.8 一个树翻译的例子 (51)3.9 检查/调试AST (53)第4章记号流(Token Streams) (54)4.1引言 (54)4.2自由通过记号流 (55)4.3记号流过滤 (56)4.4记号流分离 (57)4.4.1例子 (58)4.4.2过滤器实现 (59)4.4.3如何使用这个过滤器 (60)4.4.4树的创建 (61)4.4.5垃圾回收 (62)4.4.6附注 (62)4.5记号流多路技术(又叫"词法分析器多状态") (63)4.5.1多词法分析器 (63)4.5.2词法分析器共享同一字符流 (66)4.5.3分析多元记号流 (66)4.5.4多记号流超前扫描的效果 (68)4.5.5多词法分析器vs调用另一条词法规则 (68)4.6 TokenStreamRewriteEngine 简单的语法制导翻译 (70)4.7 未来 (70)第5章记号(token)词汇表 (71)5.1引言 (71)5.1.1 ANTLR如何决定哪个词法符号是什么记号类型? (72)5.1.2为什么记号类型从4开始 (72)5.1.3 ANTLR生成什么样的词汇表相关的文件 (72)5.1.4 ANTLR怎样同步在同一文件和不同文件里文法的符号类型映射 (72)5.2文法继承和词汇表 (74)5.3识别器生成顺序 (75)5.4词汇表的一些使用技巧 (76)第6章错误处理及恢复 (78)6.1、ANLTR的异常体系结构 (78)6.2 借助文法来修改默认的错误消息 (81)6.3 解析异常处理 (81)6.4 指定解析异常处理方法 (82)6.5 Lexer中的默认异常处理 (83)第7章Java Runtime Model (85)第8章C++ Runtime Model (85)第9章C# Runtime Model (85)第10章Python Runtime Model (85)第11章ANTLR树构建 (85)11.2 控制AST构建 (86)11.3 构建AST的语法注释 (86)11.3.1叶节点 (86)11.3.2 根节点 (86)11.3.3 关闭标准树的构建 (87)11.3.4树节点构建 (88)11.3.5 AST Action换化 (88)11.4 执行解析创建树 (90)11.5 AST工厂 (90)11.6异类ASTs (92)11.6.1 一棵表达式树例子 (93)11.6.2 使用语法描述异构树 (100)11.7 AST(XML)序列化 (101)11.8 AST枚举 (102)11.9 一些例子 (102)11.10 标签子规则 (103)11.11 引用节点 (107)11.12 必需的AST功能与形式 (107)第12章语法继承(Grammar Inheritance) (110)12.1 语法继承(Grammar Inheritance) (110)12.2 功能(Functionality) (113)12.3 父语法(Supergrammar)可以放置的位置 (115)12.4 错误信息(Error Messages) (116)第13章选项(Options) (116)13.1文件、语法和规则的选项(File, Grammar, and Rule Options) (116)13.1.1 ANTLR中支持的选项(Options supported in ANTLR) (118)13.1.2 language: 设置生成的目标语言 (121)13.1.3 k: 设置lookahead(前瞻)的深度 (121)13.1.4 importVocab: 初始化语法词汇表 (122)13.1.5 exportVocab: 指定导出词汇表的名称 (123)13.1.6 testLiterals: 是否生成常量检测代码 (124)13.1.7 defaultErrorHandler: 设置默认的错误处理器 (125)13.1.8 codeGenMakeSwitchThreshold: 控制代码的生成 (126)13.1.9 codeGenBitsetTestThreshold: 控制代码的生成 (126)13.1.10 buildAST: 自动创建抽象语法树(AST) (127)13.1.11 ASTLabelType: 设置节点类型 (127)13.1.12 charVocabulary: 设置词法分析器的字符表 (128)13.1.13 warnWhenFollowAmbig (129)13.2 命令行选项(Command Line Options) (131)前言ANTLR是什么ANTLR, 语言识别的另一个工具(ANother Tool for Language Recognition ),(前身是PCCTS)是一种语言工具,它提供了一个框架,可以通过包含Java,C++,或C#动作(action)的语法描述来构造语言识别器,编译器和解析器。
antlr 案例
antlr 案例摘要:1.ANTLR 简介2.ANTLR 案例背景3.ANTLR 案例实现过程4.ANTLR 案例结果与分析5.总结正文:1.ANTLR 简介ANTLR(Another Tool for Language Recognition)是一款强大的解析生成工具,它可以帮助开发者处理结构化文本数据。
ANTLR 使用一种类似于C++的语法定义语言,允许开发者定义自己的解析器和词法分析器。
借助ANTLR,开发者可以方便地处理各种文本格式,例如SQL、JSON、XML 等。
2.ANTLR 案例背景假设我们有一个需求,需要对一段SQL 语句进行解析,以便提取其中的表名、列名和查询条件等信息。
为了实现这个需求,我们可以使用ANTLR 来编写一个SQL 解析器。
3.ANTLR 案例实现过程首先,我们需要使用ANTLR 的语法定义语言来编写SQL 解析器的词法分析器和解析器。
以下是一个简单的示例:```grammar SQL;sql: statement EOF;statement: createTable| insertInto| select| delete| update;createTable: "CREATE TABLE" tableName "(" columnDefinitons ")";insertInto: "INSERT INTO" tableName "(" columnDefinitons ")";select: "SELECT" columnNames "FROM" tableName "WHERE" condition;delete: "DELETE FROM" tableName "WHERE" condition;update: "UPDATE" tableName "SET" columnUpdates "WHERE" condition;tableName: "table_name";columnDefinitons: columnDefinition ( "," columnDefinition )*;columnDefinition: dataType columnName;columnNames: columnName ( "," columnName )*;condition: "condition";dataType: "INT"| "VARCHAR"| "DATE"| "TIMESTAMP"| "FLOAT"| "DOUBLE"| "BOOLEAN";columnName: "column_name";```接下来,我们需要使用ANTLR 工具生成解析器和词法分析器。
使用 Antlr 开发领域语言
使用Antlr 开发领域语言简介: Antlr 是一个基于Java 开发的功能强大的语言识别工具,Antlr 以其简介的语法和高速的运行效率在这类工具中出类拔萃。
当你需要开发一种领域语言时,语言可能像Excel 中的公式一样复杂,也可能像本文中的例子一样简单(只有算术运算),这时你可以考虑使用Antlr 来处理你的语言。
发布日期: 2011 年3 月07 日级别:高级Antlr 简介1.ANTLR 语言识别的一个工具(ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含Java, C++, 或C# 动作(action)的语法描述来构造语言识别器,编译器和解释器。
计算机语言的解析已经变成了一种非常普遍的工作,在这方面的理论和工具经过近40 年的发展已经相当成熟,使用Antlr 等识别工具来识别,解析,构造编译器比手工编程更加容易,同时开发的程序也更易于维护。
2.语言识别的工具有很多种,比如大名鼎鼎的Lex 和YACC,Linux 中有他们的开源版本,分别是Flex和Bison。
在Java 社区里,除了Antlr 外,语言识别工具还有JavaCC 和SableCC 等。
3.和大多数语言识别工具一样,Antlr 使用上下文无关文法描述语言。
最新的Antlr 是一个基于LL(*) 的语言识别器。
在Antlr 中通过解析用户自定义的上下文无关文法,自动生成词法分析器(Lexer)、语法分析器(Parser) 和树分析器(Tree Parser)。
回页首Antlr 能做什么编程语言处理识别和处理编程语言是Antlr 的首要任务,编程语言的处理是一项繁重复杂的任务,为了简化处理,一般的编译技术都将语言处理工作分为前端和后端两个部分。
其中前端包括词法分析、语法分析、语义分析、中间代码生成等若干步骤,后端包括目标代码生成和代码优化等步骤。
Antlr 致力于解决编译前端的所有工作。
antlr 条件正则
antlr 条件正则一、什么是 antlr?ANTLR(全称为 ANother Tool for Language Recognition)是一个强大的语言分析器生成器,它可以根据给定的语法规则生成解析器和词法分析器。
ANTLR 使用LL(*) 解析算法,能够处理上下文无关文法和上下文相关文法。
ANTLR 最初是由 Terence Parr 开发的,目前已经发展成为一个广泛使用的工具,支持多种语言,包括 Java、C#、Python 等。
ANTLR 生成的解析器可以用于构建编译器、解释器、翻译器等语言处理工具。
二、条件正则的概念条件正则是一种基于正则表达式的语法扩展,它允许使用条件语句来描述更复杂的正则匹配规则。
条件正则可以用于识别一些复杂的语言结构,如嵌套的括号、嵌套的标签等。
条件正则的语法类似于正则表达式,但增加了一些额外的语法元素。
其中最重要的元素是条件语句,它允许在正则表达式中根据不同的条件选择不同的匹配规则。
三、ANTLR 支持的条件正则语法ANTLR 提供了一种特殊的语法来支持条件正则。
在ANTLR 的语法规则中,可以使用->操作符来定义条件语句。
条件语句的语法如下所示:condition: expression1 -> action1| expression2 -> action2| ...;其中,expression是一个正则表达式,action是一个代码块,用于处理匹配到的文本。
四、使用条件正则进行文本匹配使用条件正则进行文本匹配的过程包括以下几个步骤:1.定义语法规则:首先需要定义一个语法规则,用于描述待匹配的文本结构。
2.编写条件语句:在语法规则中使用条件语句,根据不同的条件选择不同的匹配规则。
3.编写代码块:为每个条件语句编写相应的代码块,用于处理匹配到的文本。
4.生成解析器:使用 ANTLR 工具生成解析器和词法分析器。
5.进行文本匹配:使用生成的解析器对待匹配的文本进行匹配操作。
antlr g4语法
ANTLR G4语法简介ANTLR(全称为ANother Tool for Language Recognition)是一种强大的解析器生成器,它能够根据语法规则生成相应的解析器。
ANTLR使用G4(ANTLR语法)作为其输入语言,G4是一种简洁且易于理解的形式化文本表示法。
ANTLR G4语法允许开发人员定义自己的DSL(领域特定语言),并自动生成与之相匹配的解析器。
这使得开发人员能够更加专注于DSL的设计和实现,而无需手动编写解析器。
在本文中,我们将详细介绍ANTLR G4语法,并提供一些示例来说明如何使用它来定义和生成解析器。
ANTLR G4基础ANTLR G4是一种上下文无关文法(Context-Free Grammar),它由一系列规则组成。
每个规则由一个唯一标识符、一个箭头符号->和一个右侧表达式组成。
右侧表达式由终结符、非终结符和操作符构成。
终结符代表了最基本的语言单元,如关键字、标识符、运算符等。
非终结符代表了一个或多个终结符的组合。
操作符用于指定规则之间的关系,例如选择、顺序和重复。
下面是一个简单的示例,演示了如何使用ANTLR G4语法定义一个简单的四则运算表达式语言:grammar Arithmetic;expression: term ( ( '+' | '-' ) term )* ;term: factor ( ( '*' | '/' ) factor )* ;factor: NUMBER | '(' expression ')' ;NUMBER: [0-9]+ ;在上面的示例中,我们定义了三个规则:expression、term和factor。
其中,expression规则表示一个完整的表达式,由一个或多个term和操作符组成;term 规则表示一个项,由一个或多个factor和操作符组成;而factor规则表示一个因子,可以是一个数字(NUMBER)或者是用括号括起来的表达式。
antlr 应用场景
antlr 应用场景ANTLR是一种强大的语言处理工具,可用于许多应用场景。
下面我将从不同的角度描述ANTLR的应用场景。
1. 编译器和解释器:ANTLR可以用于构建编译器和解释器,将高级编程语言转换为机器语言或解释执行。
它可以根据语法规则生成词法分析器和语法分析器,帮助开发者处理编程语言的语法结构。
2. 代码生成:ANTLR可以用于生成代码,尤其是在领域特定语言(DSL)开发中非常有用。
通过定义语法规则和语义动作,ANTLR 可以将DSL转换为目标语言的源代码,从而简化代码生成过程。
3. 数据格式解析:ANTLR可以用于解析和处理各种数据格式,如XML、JSON、CSV等。
通过定义语法规则和语义动作,ANTLR可以将复杂的数据格式转换为易于处理的数据结构,从而简化数据解析的过程。
4. 语言转换和转码:ANTLR可以用于语言之间的转换和转码。
例如,可以使用ANTLR将一种编程语言转换为另一种编程语言,或者将一种数据格式转换为另一种数据格式。
5. IDE插件开发:ANTLR可以用于开发IDE插件,提供语法高亮、代码补全、语法检查等功能。
通过定义语法规则和语义动作,ANTLR可以帮助开发者实现各种语言相关的功能。
6. 自然语言处理:ANTLR可以用于自然语言处理(NLP)任务,如句法分析、语义分析等。
通过定义语法规则和语义动作,ANTLR可以帮助开发者处理自然语言的语法和语义结构。
7. 数据库查询解析:ANTLR可以用于解析和处理数据库查询语言(如SQL)的语法结构。
通过定义语法规则和语义动作,ANTLR可以帮助开发者解析和处理复杂的数据库查询。
8. 配置文件解析:ANTLR可以用于解析和处理各种配置文件,如INI文件、YAML文件等。
通过定义语法规则和语义动作,ANTLR 可以将配置文件转换为易于处理的数据结构,从而简化配置文件的解析和处理过程。
ANTLR是一种非常有用的语言处理工具,可应用于多个领域。
antlr4语法
antlr4语法ANTLR4是一个流行的语法分析器生成器,它能够根据用户定义的语言规范生成对应的解析器和词法分析器。
ANTLR的语法规则是使用一种高度可读性的文本格式编写的,它能够灵活地处理大量的语言特性。
本文将介绍ANTLR4的基本语法,包括词法规则、语法规则和语义动作。
首先,ANTLR4的词法规则定义了输入文本的基本单元,也就是词法符号。
词法符号可以是关键字、运算符、标识符、常数等。
下面是一个示例的词法规则:```ID : [a-zA-Z]+ ;NUM : [0-9]+ ;OP : '+' | '-' | '*' | '/' ;```其中,ID用于匹配由一个或多个字母组成的标识符,NUM用于匹配由一个或多个数字组成的常数,OP用于匹配四则运算符。
这些规则使用正则表达式来定义,可以根据实际需要进行修改。
接下来,ANTLR4的语法规则定义了输入文本的结构和语法。
语法规则使用BNF(巴科斯范式)的形式来描述语言的语法。
下面是一个简单的示例:```expression : expression OP expression| ID| NUM;```这个语法规则定义了一个表达式,它可以由两个子表达式和一个操作符组成,或者是一个标识符,或者是一个常数。
这个语法规则可以递归地定义表达式的结构,使得更复杂的表达式可以被正确地解析。
最后,ANTLR4还支持语义动作,它可以在语法规则中嵌入代码,用于执行一些额外的操作。
语义动作可以放置在规则的任意位置,以控制解析器的行为。
下面是一个示例:```expression : expression OP expression{ System.out.println("Performing operation: " + $OP.text); } | ID| NUM;```这个语义动作在解析表达式的时候打印出操作符的文本内容,用于调试和追踪解析过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Antlr简介06通讯软件 06382027 毅本文主要介绍了什么是ANTLR,以及ANTLR的使用,其中ANTLR的使用包括了ANTLR的安装及使用,ANTLR语法文件解析,ANTLR规则(RULE)解析,ANTLR语法实例—SensorSQL,ANTLR Studio及其功能介绍等。
Antlr(ANother Tool for Language Recognition)是一个工具,前身是 PCCTS,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器(translators)提供了一个基础。
通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳苦。
它是这样的一种工具,它可以接受文法语言描述,并能产生识别这些语言的语句的程序。
作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。
ANTLR知道怎样去生成识别程序,语言包括Java,C++,C#和不久的Python。
ANTLR知道怎样构建识别程序,这些程序可以对以下三种不同的输入应用文法结构:(i) 字符流, (ii) 记号流,和(iii)两维的树结构。
很自然的它们分别与词法分析程序(lexers,以下简称lexer),语言解析程序和树遍历程序向匹配。
这个用于定义这些语法的元语言,在所有情况下几乎一样的。
一旦你对ANTLR和类似工具比较顺手,你会开始以一种新的目光来看编程。
许多任务强烈需要语言解决方案,而不是采用传统编程语言的做法。
比如,这些过程的注解都是用特伦斯标记语言写的。
而ANTLR 则能来将文本(含一些额外的东西和转换)转化为HTML,PDF或者其他那些生成程序的文件格式。
最后,ANTLR只是一件工具,仅仅这些。
虽然它能通过将容易理解的乏味部分自动化来帮助你创建软件,但却不能企图让你指定整个编译器。
例如,在单个的描述里就不行。
那些宣称这类事情非常伟大,可以为发布刊物文章编写惊人的“一揽子解决方案”,却会悲惨失败在实际项目中。
词法分析器(Lexer)词法分析器又称为Scanner,Lexical analyser和Tokenizer。
程序设计语言通常由关键字和严格定义的语法结构组成。
编译的最终目的是将程序设计语言的高层指令翻译成物力机器或虚拟机可以执行的指令。
此法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token)括关键字,标识符,符号(symbols)和操作符供语法分析器使用。
语法分析器(Parser)编译器又称为Syntactical analyser。
在分析字符流的时候,Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系,而这就是Parser的工作。
语法分析器将收到的Tokens组织起来,并转换成为目标语言语法定义所允许的序列。
无论是Lexer还是Parser都是一种识别器,Lexer是字符序列识别器而Parser是Token序列识别器。
他们在本质上是类似的东西,而只是在分工上有所不同而已。
ANTLRANTLR将上述两者结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。
然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。
用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。
Antlr使用安装及使用到/下载最新版本的ANTLR开发包和源码(例如版本3.01)。
将antlr-3.0.1.jar所在目录配置到你的环境变量中,写好语法文件(例如SensorSQL.g),运行命令“java antlr.Tool SensorSQL.g”就可以获得自动生成语法/词法分析器。
ANTLR语法文件解析下面我们对图中所描述的ANTLR语法文件做一些详细的分析。
为了更好的使用ANTLR,你还可以下载ANTLR 的Eclipse插件来帮助你完成工作。
1.header域:所有出现在这里的部分,都会出现在由ANTLR编译之后生成的Java文件的最顶部。
在本例中你可以将包名和其他信息放到这一区域中,生成的结果如由面对应代码部分所示。
2.你在这一部分所提供的容对于文件中的每个语法都是唯一的。
这一区域的容将出现在实际的类定义之前。
也就是说,两个import仅属于类CalcParser,而不属于在同一个文件中定义的其他类(如CalcLexer)3.这里是语法定义部分,你同样可以将它看成是类定义。
4.在Option域中,你可以为你的语法提供可选项。
例如是否建立缺省的抽象语法树,指定LL(K)中的参数k的值(缺省为1)等等,更详细的参数请参阅ANTLR自带的手册。
5.Token部分用来声明那些在词法分析器中没有被声明的“想象的”token。
这些信息通常用在TreeParser中指定“想象”的节点。
6.这是另一个Action区,ANTLR将会忠实地将这一区域的信息放置到类的定义当中,相当于类的成员方法,主要为用户提供一种在Parser种定制可扩展方法的途径。
ANTLR规则(RULE)解析在ANTLR的语法文件中,一个规则的定义是与一个由ANTLR生成的Java源文件相对应的。
1,2,3,4:正如你所看到的那样,我们可以在一个规则定义中作与一个函数等价的所有事情。
我们可以为规则指定参数(像上面的int a),制定返回值(int c),甚至抛出一个异常。
从右半面我们可以清楚地看到,所有在规则中定义的容都被忠实而准确的翻译到Java源文件的相应位置。
5:这一可选的部分为我们提供了指定某些可选参数的能力。
例如图中所示代表告诉ANTLR在生成代码的时候不要生成缺省的错误处理部分,这部分将由用户自己负责。
7:在异常处理部分,我们可以指定自定义的异常处理方法。
像这里就仅仅是打印错误栈信息。
ANTLR语法实例—SensorSQLSensorSQL是一个自定义的简化版SQL语言,它所支持的语法定义这里就不详细列出了,我只是给出查询的示例:通常,编译一个查询的目的是要把它转化成某种被查询设备可以理解的形式。
通常的做法有两种,一种是像在上一节中提到的那样,写好详细的语法规则,在ANTLR生成相应的Java文件之后,就可以直接使用其运行结果。
这样的例子有很多,其中最典型的就是对于算数表达式的解析了。
对于形如1+2-3*4/5^6这样的表达式,只要写好语法规则,就可以在解析过程中直接得到运算结果:首先ANTLR将其编译成逆波兰结构-- ( - ( + 1 2 ) ( / ( * 3 4 ) ( ^ 5 6 ) ) ) ;在生成语法树的过程中,同步计算表达式的值,即类似于2.3节中看到的表达式计算。
结果如下:不过这样作有一个缺点,就是在很多情况下,你可能并不知道要用什么样的方法来处理。
所以当真正要开始写处理代码的时候,就要受限于已有的Parser/Lexer中的代码。
一旦要有所修改,就要重新编译语法文件,生成新的Java代码,不胜繁琐。
而且,一旦处理过程有误,就要反复调试修改Antlr生成的代。
自动生成的代码嘛,结构着实也不怎么样,调试的时候也麻烦。
所以如果效率允许的话,就没有必要让Antlr 作额外的工作,干脆就专心于做他的语法分析也就是了,其他的工作等到生成语法树之后再怎么遍历或者折腾都可以嘛J。
上图就是刚才演示的SensorSQL语法分析之后产生的结果。
在产生这个结果之后,我需要将每一个语法元素翻译成字节序列打包发送给传感器网络。
这时候,为了保证Where语句中的优先级,你就可以按照ANTLR文档中关于生成语法树的一章,生成类似于这样的结构,然后只需前序遍历这颗语法树的Where部分就可以达到目的,至于其他部分,顺序遍历一遍就好了。
ANTLR Studio有了前面的基础之后,我们就可以开始真正的工作了。
不过用“记事本或Editplus+命令行”或者干脆写个ANT脚本也不是不可以,但是总觉得在集成化IDE满天飞的时代用这个方式有点过于原始,幸好Placid System 为我们提供了一个Eclipse插件来使我们有机会直接走出原始社会。
下载地址为:.placidsystems./,目前最新版本是1.1.0。
唯一令人遗憾的是这个插件虽然功能很完善,却是要收费的,否则只有11天的试用期。
ANTLR Studio插件的安装Eclipse下插件的安装自不必多说,要注意的是从Placid System上提供的license文件,下载之后它的名字为license.lic.txt,要把它的后缀名.txt去掉,然后放到ECLIPSE_DIR\plugins\AntlrStudio_x.x.x 目录(这里 x.x.x 是版本号, 例如 - 1.1.0)。
安装成功之后在Eclipse的工具栏上会出现一个词法分析器的导航按钮:当右键单点击你的工程时,你会发现控制是否使用ANTLR Studio的开关:当打开一个文法文件之后,可以看到如下界面:在右面的大纲窗口,列有所有Parser和Lexer的元素,可以看到Protected Token(例如Number)和其他普通的Token是不一样的;在左面,不同的区域是用不同的颜色块加亮来区分的。
功能介绍ANTLR Studio在Eclipse Help提供了比较详尽的文档描述,所以这里我只介绍一些1.1.0版本的新功能。
l完全支持ANTLR3.0.1,并支持将之前的工程自动升级到1.1.0版本。
l Syntax Diagram View,可以方便的查看所输入的语法结构。
l改进了Debug功能,可以调试比较大的文法文件。
而在这之前,如果一个文法文件很大的话,ANTLR Studio就会抛出异常。
l支持自动的代码补全功能,提供一个ANTLR文档的比较全面的提示信息(如下所示)。
语法图表视图(Syntax Diagram View)在Window->Show View->Other中选择显示这个视图之后,你就可以使用这个很酷的功能了利用这个视图,你可以很容易的看到你定义语法的语法结构,例如,我的SELECT语句定义如下你只需要将光标标放到selectStatement规则的任意位置,就可以在Syntax Diagram View中看到:于是完整的语法结构清晰的显示在了我们面前。
这时你只需要将光标放到脱字符号(^)上面(注:脱字符号用于指明在生成语法树的时候,脱字符号所在的SubRule要作为树或子树的根节点):就会看到:对应的SubRule被加亮成粉红色,而如果你的光标放到的位置是一个Token的话就会变成淡蓝色,简直太酷了。