java - 识别 JFlex 1.4.3 中的小数

标签 java lex jflex

在我的 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()); }

但是每次我尝试识别带点的数字时,它都会失败并收到错误。

而不是“.”我也尝试过 \\.,\.,".",但每次都失败。

最佳答案

你是对的,.需要转义,否则它会匹配除行返回之外的任何内容。

但是引用字符是用双引号完成的,而不是单引号。

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

关于java - 识别 JFlex 1.4.3 中的小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27589165/

相关文章:

java - Apache poi 文件损坏且无法写入现有工作簿

java - 如何使用 Java Netbeans 在 GUI 中显示输出控制台

java - 没有前一个字符的字符的正则表达式匹配

java - 使用 JFlex/CUP 构建编译器并解决一些问题

java - JFlex 限制单行注释正则表达式

java - 如何在 JUnit assertEquals 中强制 BigDecimal 舍入?

java - 将文本文件解析为数字输出

c++ - 解析 C 头文件

regex - 匹配空输入的 flex 脚本?

java - JFlex 错误 : Unexpected character: YYINITIAL