ANTLR:如果后面跟随某个特定字符,则不匹配

问题描述

以下代码V编程语言中完全有效:

fn main() {
    a := 1.
    b := .1
    println("$a $b")
    
    for i in 0..10 {
        println(i)
    }
}

我想写一个词法分析器(Lexer)来给这类文件着色。 1..1应该用FloatNumber片段匹配,而..循环中的for应该用标点规则匹配。我的问题是我的FloatNumber实现已经与0.中的.100..10相匹配,并且我不知道如何告诉它如果{{1 }}跟随(或在它前面)。有点简化(不加下划线),我的语法看起来像这样:

.

解决方法

然后,您将必须引入一个谓词,以在匹配.之类的浮点数时检查前面是否没有1.

以下规则:

Plus
 : '+'
 ;

FloatLiteral
 : Digit+ '.' {_input.LA(1) != '.'}?
 | Digit* '.' Digit+
 ;

Int
 : Digit+
 ;

Range
 : '..'
 ;

在输入"1.2 .3 4. 5 6..7 8.+9"下,将产生以下令牌:

FloatLiteral              `1.2`
FloatLiteral              `.3`
FloatLiteral              `4.`
Int                       `5`
Int                       `6`
Range                     `..`
Int                       `7`
FloatLiteral              `8.`
Plus                      `+`
Int                       `9`
谓词中的

代码是特定于目标的。上面的谓词({_input.LA(1) != '.'}?)与Java目标一起使用。