本文主要记录在使用antlr4中中遇到的一些问题。
一,标明了fragment的词法是不会被parser识别的,它只会在当前词法中可用。
二,当未标明fragment的词法似乎是有包含关系的。当前面的词法包含了后面的词法时,后面的词法将不被parser解析出来。(可以看第9小节关系词法包含关系)。
三,antlr的ieda插件只支持4.4以上的版本,所以如果需要生成4.4一下的版本的话,可以使用maven插件,或者手工生成。
四,当一个词法中出现了2个同名的tokens名称时,另一个需要命名一个别名,不然会引起冲突。
//tokens1
term4 returns [Exp exp]
: term3 {
$exp = $term3.exp;
}
| NOT term4 {
$exp = new UnresolvedFunCall("NOT", Syntax.Prefix, new Exp[] {$term4.exp}); //$term4.exp取的是第一行的term4的内容
}
;
//tokens2
term4 returns [Exp exp]
: term3 {
$exp = $term3.exp;
}
| NOT term4alias = term4 {
$exp = new UnresolvedFunCall("NOT", Syntax.Prefix, new Exp[] {$term4alias.exp});//命名别名后,取出的才是真正需要的的内容,即当前term4下的表达式
}
;