如何解决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.
中的.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目标一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。