以下代码在V编程语言中完全有效:
fn main() {
a := 1.
b := .1
println("$a $b")
for i in 0..10 {
println(i)
}
}
我想为这种文件的语法编写一个Lexer。1.
并.1
应匹配FloatNumber
的片段,而..
在for
-loop应该由一个标点符号规则相匹配。我的问题是我的FloatNumber
实现已经匹配,0.
并且.10
从实现,0..10
并且我不知道如何告诉它是否不匹配(如果.
跟随)(或在它前面)。有点简化(不加下划线),我的语法如下所示:
fragment FloatNumber
: ( Digit+ ('.' Digit*)? ([eE] [+-]? Digit+)?
| Digit* '.' Digit+ ([eE] [+-]? Digit+)?
)
;
fragment Digit
: [0-9]
;
然后,您将不得不引入一个谓词,该谓词用于检查.
与之类的float匹配时是否没有前方1.
。
以下规则:
Plus
: '+'
;
FloatLiteral
: Digit+ '.' {_input.LA(1) != '.'}?
| Digit* '.' Digit+
;
Int
: Digit+
;
Range
: '..'
;
给定input "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目标。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句