antlr4-语义预测(九)

在这一节,我们将介绍anltr的特别的行为 {…}?,就是所谓的语义预测。可以让我们在运行的时候使部分语法无效。预测是boolean型的表达式,可以有效的减少解析树的选择。

有2个比较常用的语义预测用例。第一个,我们可能需要一个解析器去处理多个,有点不同版本的相同语言。例如,各个数据库厂商的定制sql语言。
第二个,可能涉及解析语法模糊不清的部分。在有些语言中,相同的词法构造可能意味着不同的含义,预测可以让我们在多个含义中选择一条。

例子太简单了,这里就不介绍了。
有一点需要注意的是,看下面这个例子,ENUM必须在ID的前面。这是因为‘enum’被包含在ID中,antlr对这种模糊不清的词法总是优先用第一个解析,在下面的例子中是ENUM。如果将他们颠倒的话,那么‘enum’将被永远的解析为ID了。
predicates/Enum2.g4
ENUM: ‘enum’ {java5}? ; // must be before ID
ID : [a-zA-Z]+ ;