问题描述
fn main() {
a := 1.
b := .1
println("$a $b")
for i in 0..10 {
println(i)
}
}
我想写一个词法分析器(Lexer)来给这类文件着色。 1.
和.1
应该用FloatNumber
片段匹配,而..
循环中的for
应该用标点规则匹配。我的问题是我的FloatNumber
实现已经与0.
中的.10
和0..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目标一起使用。