`

antlr学习笔记

 
阅读更多

1、VT_CONDITION[$value]带中括号的含义?
condition_key
: {validateIdentifierKey("condition")||validateIdentifierKey("when")}? value=LITERAL
-> VT_CONDITION[$value]
含义为:为VT_CONDITION设置此token的行号和列号为$value的行号和列号,另外还可以设置此虚拟token的text属性值。
如:VT_CONDITION[$value,"condition"]

2、重写的时候只能对目前的语法中的值进行组装,无法修改?
AST的作用:
a)记录输入tokens的含义,且仅仅是token的含义。
b)编码,去掉不必要的token。
c)易于计算机识别和定位。

3、parser和treewalker如何分工?

4、上下文相关看第13章:Semantic Predicates语义判断
expr : {<<lookahead(1) is function>>}? functionCall
| {<<lookahead(1) is type>>}? ctorTypecast
;
上句的意思是:如果前面上下文判定为函数则匹配functionCall,前面上下文判定为类型则匹配类型强制转换。
此处的关键点为{java代码,结果为布尔值}?
5、综合预测看第14章:syntactic predicate
stat : (declaration)=> declaration
| expression
;
上句的意思是:如果declaration能匹配则优先匹配declaration。
6、文法编写的优先级需要特别注意
优先级低的放前面,优先级高的放后面,这和LL的深度优先处理是有很大关系的,要认真体会。
7、文法中规则的引用最终转换成方法的引用,字token最终转换成match(token)的调用。
8、EOF在unix下要按ctrl+d键,windows下按ctrl+z键。
9、->为语法规则重写,语法重写仅仅能够改变token的顺序,或者减少token,但不能进行语义的增加。
10、^在语法规则中使用时,放在作用的字(token)的后面,表示前面的字(token)为树的根节点。在语法规则重写中使用时,放在作用的字(token)的前面,表示后面的字(token)为树的根节点
11、!在语法规则中使用时,放在作用的字(token)的后面,表示前面的字(token)不作为树的一部分。
12、WS没有用为啥还要配上?
好像默认是有用的。

13、antlr规则语法
/** comment */
access-modifier rule-name[<<arguments>>] returns [<<return-values>>]
<<throws-spec>>
<<options-spec>>
<<rule-attribute-scopes>>
<<rule-actions>>
: <<alternative-1 >> -> <<rewrite-rule-1 >>
| <<alternative-2 >> -> <<rewrite-rule-2 >>
...
| <<alternative-n>> -> <<rewrite-rule-n>>
;
<<exceptions-spec>>
14、使用+=时,必须要有output选项
options {output=AST;} // or output=template
elist: e+=expr (',' e+=expr)* ;
15、规则可以带多个参数,也可以返回多个参数,但是如何传参和返回?
r[int a, String b] returns [int c, String d] return value.
: ... {$c=$a; $d=$b;}
调用时传参
s : ... v=r[3,"test"] {System.out.println($v.d);}
;
16、全局范围属性,主要用于规则之间变量共享
method
@scope {
String name;
}
: 'void' ID {$method::name = $ID.text;} '(' args ')' body
;
atom: ID {System.out.println("ref "+$ID.text+" in "+$method::name);}
;
17、模板使用
expr: ^(CALL c=expr args=exprList) -> call(m={$c.st},args={$args.st})
| ^(INDEX a=expr i=expr) -> index(list={$a.st},e={$i.st})
| primary -> {$primary.st} // return ST computed in primary
;
上面使用到的模板定义:
call(m,args) ::= "<m>(<args>)"
index(list,e) ::= "<list>[e]"
18、手动调用emit( )可以让一个token输出多个token,但是注意CommonTokenStream类不支持多个token输出。
INDENT token at a time.
: // turn on rule only if at left edge
{getCharPositionInLine()==0}?=>
(' ' |'\t' )+ // match whitespace
{
if ( <<indentation-bigger-than-before>> ) {
// can only indent one level at a time
emit(<<INDENT-token>>);
<<track increased indentation>>
}
else if ( <<indentation-smaller-than-before>> ) {
int d = <<current-depth >> - <<previous-depth >>;
// back out of d code blocks
for (int i=1; i<=d; i++) {
emit(<<DEDENT-token>>);
}
<<reduce indentation>>
}
}
;
19、在规则级别可以设置如下选项:
backtrack当匹配需要回溯时采用,经常和memoize配合使用。
memoize当匹配需要回溯时,不用对以前分析过的规则重新进行分析,提高匹配效率。
k为能回溯的最大深度
decl
options {
memoize=true;
}
: type ID (',' ID)*
;
20、tokens语法,主要用于虚拟树节点。
tokens {
token-name1 ;
token-name2 = 'string-literal' ;
...
}
注意如下用法:别名
grammar T;
tokens {
MOD='%' ; // alias MOD to '%'
}
expr : INT (MOD INT)* ;
21、全局scope语法,主要用于规则之间的变量共享,与规则@scope的区别?
scope name {
type1 attribute-name1 ;
type2 attribute-name2 ;
...
}
scope SymbolScope {
List symbols;
}
22、action语法
@action-name { ... }
@action-scope-name::action-name { ... }
注意:
如果@header {...}不带action-scope-name,默认表示为 @parser::header{...}
23、语法级选项
options {
name1 = value1 ;
name2 = value2 ;
...
}
language选项:最终antlr会根据此选项,按照文法生成对应语言(比如java)的实现。antlr会根据CLASSPATH查找org/antlr/
codegen/templates/Java进行JAVA代码的生成。

output选项:这个选项只能出现在combined,parser和tree三种文法中,并且在tree文法中,output选项只能为template,不能是AST。
此选项默认为不输出。注意只有output=AST时,才可以使用规则重写->(rewrite rules)和树构建操作符(^,!)。
另外如果规则没有定义返回值,且output没有设置的话,规则的返回值为void,否则都是有值的:
grammar T;
options {
output=AST;
}
decl : ID -> ^(DECL ID) ;
ID : 'a'..'z' + ;
public static class decl_return extends ParserRuleReturnScope {
Object tree;
public Object getTree() { return tree; }
};
public decl_return decl() throws RecognitionException {...}
如果设置为:output=template
public static class decl_return extends ParserRuleReturnScope {
public StringTemplate st;
/** To avoid unnecessary dependence on StringTemplate library,
* superclass uses Object not StringTemplate as return type.
*/
public Object getTemplate() { return st; }
};
public decl_return decl() throws RecognitionException {...}

backtrack选项:默认为false。
memoize选项:默认为false。
tokenVocab选项:导入token词汇,主要用于tree文法中,用于导入parser文法中的token,此选项默认不导入任何词汇。
rewrite选项:默认为false,只有output=template才有用,主要用于转换差别不大的文法是采用。
grammar T;
options {output=template; rewrite=true;}
decl: type ID ';' ; // no translation here
type: 'int' -> template() "Integer" // translate int to Integer
| ID // leave this alone
;
superClass选项:指定生成parser或代码的父类,默认为空。
filter选项:仅对lexer有用,默认为false,也就是不过滤,当为true时,如果lexer匹配不上token,将会过滤无法识别token,继续匹配后续token。
主要用于模糊匹配,只匹配关心的token。
ASTLabelType选项:设置tree标签,tree表达式目标语言的类型,默认为Object类型。
TokenLabelType选项:设置token标签,token表达式目标语言的类型,默认为接口Token类型。

24、语法动作
什么是动作,简单说来,只要放在{和}之中的语言(java)代码,就是动作。
25、预先定义的token属性
属性名称 属性类型 属性含义
text String token的值
type int token的类型
line int token所在的行号,从1开始算起。
pos int token所在行的偏移位置,从0算起。
index int 当前token在所有token流中的下表,从0算起。
channel int token所在的通道号,默认通道为Token.DEFAULT_CHANNEL其值为0,默认的隐藏通道为Token.HIDDEN_CHANNEL。
tree Object token所在的上一级树节点。

lexer grammar T;
R : a='c' b='hi' c=. {$a, $b.text, $c} ;
只有多于两个字符的才算token,否则就是字符,不能引用token的属性。

26、预先定义的parser规则属性
属性名称 属性类型 属性含义
text String rule对应的值,即规则匹配到的所有token。
start Token rule对应开始token,也就是第一个token。
stop Token rule对应结束token,也就是最后一个token,如果在当前规则中使用的话,一般只在after动作中才能使用。
tree Object rule的树节点,如果在当前规则中使用的话,一般只在after动作中才能使用。
st StringTemplate rule的模板,如果在当前规则中使用的话,一般只在after动作中才能使用。

27、预先定义的tree规则属性
text String rule对应开始树节点的值。
start Object rule对应开始树节点,也就是第一个树节点。
st StringTemplate rule的模板,如果在当前规则中使用的话,一般只在after动作中才能使用。

28、在动作中引用属性
使用$引用token或者规则属性,使用%引用模板表达式。

29、模板,既可以在parser中使用,也可以在tree文法中使用。
模板有两种定义方式,一种是嵌入定义方式:
-> template(<<attribute-assignment-list >>) "in-line-template"
如果多行则是这样:
... -> template(?attribute-assignment-list ?)
<<
?in-line-template-spanning-multiple-lines?
>>
另外一种是将模板定义在文件中:
group T;
assign(x,y) ::= "<x> := <y>;"

30、
semantic predicates有三种形式:
{布尔表达式}? 放在选项前面
{布尔表达式}? 放在选项后面,作验证之用。
{布尔表达式}?=> 放在选项前面,作开关之用。
31、
[\x80-\xff]{2} 可以匹配一个汉字。

分享到:
评论

相关推荐

    The Definitive ANTLR4Reference 学习笔记

    学习ANTLR 4的参考手册时,首先需要了解的是语言、语法、解析树、词法单元和解析器的基本概念。语言由一系列有效句子组成,每个句子包含短语,而短语又由子短语组成。语法是语言的语法规则的正式定义,它指定了子...

    The+Definitive+ANTLR+4+Reference 学习笔记word

    这本书的学习笔记将帮助读者深入理解ANTLR4的工作原理和实践应用。 ANTLR4的核心功能包括: 1. **语法定义**:ANTLR4允许用户使用EBNF(扩展巴科斯范式)来定义语法规则,这是一种形式化的语法描述语言。这些规则...

    antlr笔记

    这篇笔记主要涵盖了ANTLR的相关知识,结合了“编译原理LL(K).ppt”的内容,我们将深入探讨ANTLR的工作原理以及在源码分析和工具开发中的应用。 ANTLR的工作流程主要包括以下几个步骤: 1. **语法定义**:ANTLR使用...

    antlr4读书笔记七八章

    ### ANTLR4读书笔记七八章详解 #### 第七章:从特定于应用程序的代码解耦语法 在学习了如何使用ANTLR定义语言语法后,我们了解到语法本身虽然能够验证一个输入句子是否符合语言规范,但对于实际开发语言应用程序来...

    An Introduction To ANTLR

    例如,Terence Parr本人就使用ANTLR开发了一个名为TML(Terence's Markup Language)的简单标记语言,用于撰写课程笔记和其他文档。TML被设计为易于编写,通过ANTLR转换成HTML或PDF格式,从而简化了文档创作的过程。...

    antlr4-short-course

    ANTLR 4简明教程是一本介绍ANTLR 4使用方法的书籍,内容基于最新版ANTLR 4的语法编写,作者在阅读官方参考书时整理了自己的读书笔记,并在此基础上增加了新的内容。这本书以开源形式编写,源码托管在GitHub上,方便...

    Hibernate学习笔记(1-13)

    【Hibernate学习笔记(1-13)】是传智播客李勇的教程,涵盖了Hibernate框架的基础到进阶内容。Hibernate是一个流行的ORM(对象关系映射)框架,它旨在解决Java面向对象编程与关系型数据库之间的模型不匹配问题,即...

    spring学习笔记

    为了搭建 Spring 开发环境,我们需要在项目中引入必要的库文件,如 Ant、ANTLR、AOP Alliance、ASM、DOM4J、JTA、Jakarta Commons、CGLIB 和 Log4j 等。同时,还需要在 XML 配置文件中指定 DTD(Document Type ...

    CXF webservice初学笔记

    【CXF Webservice初学笔记】 Apache CXF 是一个开源的 Web 服务框架,它允许开发者创建和消费各种类型的 Web 服务。CXF 整合了 XFire 和 Celtix 两个项目,提供了一套全面的工具和服务接口,支持 SOAP、RESTful、WS...

    dwr笔记整理(三)

    7. **antlr-2.7.6rc1.jar**:ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。在DWR中,它可能用于解析配置文件或生成动态Java代码。 8. **standard-1.1.2.jar**:可能是用于...

    hibernate 笔记

    本文主要基于一份关于 Hibernate 的学习笔记,详细阐述 Hibernate 的基本配置流程及常见问题。 #### 二、Java 配置 Hibernate 配置 Hibernate 并不是一项特别复杂的工作,但需要注意一些细节,否则很容易出现错误...

    hibernate笔记

    Hibernate 运行需要一系列的 jar 包,包括:antlr.jar、cglib.jar、asm.jar、commons-collections.jar、commons-logging.jar、jta.jar 和 dom4j.jar。这些库分别用于解析 HQL 语句、动态生成类、集合操作、日志记录...

    Hibernate初学笔记

    ### Hibernate初学笔记知识点概述 #### 一、Hibernate环境的搭建 - **1.1 引入基础Jar包** - **hibernate3.jar**:这是Hibernate的核心库,可以在Hibernate项目的根目录下找到。 - **Required Jars**:位于`lib/...

    UniVR-informatica:在维罗纳大学计算机科学系学习期间写的笔记和总结

    UniVR-informatica 注释和为学士学位的计算机科学硕士学位在工程和计算机科学课程摘要。 内容 ...为ANTLR语言课程详述 高手 Magistrale I anno硕士学位(AY 2020-2021): 编程基础和规范语言(第

    独家! 中国科技大学 陈意云 编译原理全套!课堂ppt,历年考试真题,课程实验讲稿

    压缩包内的文档文件可能是陈意云教授的课程补充资料或学生的学习笔记。例如,"chap1.doc"到"chap6.doc"可能对应课程的六个主要章节,详细阐述了编译原理的各个主题。"contents.doc"可能是课程大纲,列出了每个章节的...

    TigerWorks:佐治亚理工学院 CS4240 的 Tiger 编译器

    通过参与 TigerWorks 项目,学生将深入理解编译器的工作原理,学习如何使用 ANTLR 设计和实现解析器,以及如何进行语义分析、中间代码生成和优化。此外,他们还将学习如何编写测试用例以确保编译器的正确性,这对于...

Global site tag (gtag.js) - Google Analytics