antlr4-使用小结(续)

本文主要记录在使用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下的表达式
}
;