读The Definitive ANTLR Reference

没看的很明白,摸出来的。

lexer?parser?tree?token?

token以大写字母开头,对应目标语言的静态字段。

rule以小写字母开头对应目标语言的实例方法。

token里面的连接表现和rule里面的连接表现是不一样的。

TOKEN:

'h' 'i' //匹配hi

rule:

'h' 'i'//匹配h i,不匹配hi[中间有空格的区别]

子rule用()包含

action用{}包含,使用目标语言写

ANTLR中表示字符要用“’”单引号括起来,用‘(’ ‘)’来表示括号字符

channel:

解析的token放在不同的channel,由你来设定。

token序号是整体排序的

The token buffer preserves the relative token order regardless of the token channel numbers.

skip()小心用。

WS : (' ' |'\t' |'\r' |'\n' )+ {skip();$channel=HIDDEN;} ; //这样将匹配丢到hidden chennel可行,那么不行需要再写其他的rule时总是要写WS匹配。例: WS?'hello' WS+ 'how' WS+ 'are' WS+ 'you' -->'hello' 'how' 'are' 'you'.

Method skip( ) in an embedded lexer rule action forces the lexer to throw
out the token and look for another.运行结果似乎是视而不见【抛弃】。

fragment

如果一个token被另外的token使用,则被使用的token需要加fragment标记。

如果加了fragment,则此token不要在rule里面直接引用[如果引用了会达不到预期结果],而应该在其他的token里面引用。

对于没有加frgament的token又有个原则,它不能与其他的token有交集。即不能一个输入既可以匹配token1又可以匹配token2.

使用antlrworks时,如果出现警告,尽量消除它。尽量列举所有的情况而不要使用多个* ?来匹配。

错误解读:

line 12:15 no viable alternative at input 'xxx'

12行15字碰到没有定义的输入xxx【定义中没有列举这样的输入情况】

局部规则可能影响整个规则,特别对于+ *之类的泛匹配例如('a'..'z' | 'A'..'Z')+

暂且放下:

遇到的困难:

1:对于无引号token不知如何识别,如果使用

TOKEN=CHAR+

rule = TOKEN+

则可以匹配所有,造成整个语法混乱

2:对于递归语法不知如何识别,例如

[[...] [...]] 和 ((...) (...))


Total views.

© 2013 - 2024. All rights reserved.

Powered by Hydejack v6.6.1