读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:对于递归语法不知如何识别,例如
[[...] [...]] 和 ((...) (...))