在我的SL.lex文件中,我有这个小数的正则表达式:
Digit = [1-9]
Digit0 = 0|{Digit}
Num = {Digit} {Digit0}*
Frac = {Digit0}* {Digit}
Pos = {Num} | '.' {Frac} | 0 '.' {Frac} | {Num} '.' {Frac}
PosOrNeg = -{Pos} | {Pos}
Numbers = 0 | {PosOrNeg}
然后在
/* literals */
{Numbers} { return new Token(yytext(), sym.NUM, getLineNumber()); }
但每次我尝试用点识别数字时,它都会失败,我会收到错误。
而不是'。'我也尝试了\\.
,\.
,"."
,但每次都失败了。
答案 0 :(得分:1)
你是对的,.
需要被转义,否则它会匹配除了行返回之外的所有内容。
但引用字符是用双引号完成的,而不是单引号。
Pos = {Num} | "." {Frac} | 0 "." {Frac} | {Num} "." {Frac}
如果你这样做,输入:
123.45
按预期工作:
java -cp target/classes/ Yylex src/test/resources/test.txt
line: 1 match: --123.45--
action [29] { return new Yytoken(zzAction, yytext(), yyline+1, 0, 0); }
Text : 123.45
index : 10
line : 1
null
此外,正则表达式比联合会更强大,你可以使它更简洁:
Digit = [1-9]
Digit0 = 0 | {Digit}
Num = {Digit} {Digit0}*
Frac = {Digit0}* {Digit}
Pos = 0? "." {Frac} | {Num} ("." {Frac})?
PosOrNeg = -?{Pos}
Number = {PosOrNeg} | 0