是否可以提取“.”之前和之后的数字数?在Flex的浮子里?我希望将整数部分中的数字数限制为4,小数部分的数字限制为8,以便字符的总数包括'.‘。最多可达13。
我就是这样做的:
只有在浮动长度超过13的情况下,我才会得到错误。但是,当它的整数部分超过4个字符,小数部分超过8个字符时,我没有任何错误。
谢谢你的帮助。
发布于 2022-04-13 00:31:13
在(F)项中,宏({...})只是宏;它们被它们的定义所取代(通常被括号包围,以避免宏展开中常见的问题)。因此,您不能使用{IntPart}和{DecPart}对{float}模式中的子序列执行操作。{float} (即该宏的宏展开)匹配,或者其他两种模式之一匹配。
这将产生令人困惑的结果,因为您的{IntPart}模式与您希望它的模式不匹配。您希望它匹配一个0或一个不以0开头的整数。那将是[1-9][0-9]*|0。模式,([1-9][0-9])*|0匹配0或偶数长度整数(然后,只有在奇数位数不是0的情况下)。其他整数将由{DecPart}模式匹配,该模式也是活动的(因为所有规则都是活动的,除非使用扫描程序状态)。
由于某些整数匹配其中一种模式,而其他整数匹配另一种模式,因此很可能会应用错误的长度测试。例如,整数12345将匹配{DecPart}模式,并将与长度8进行比较,因此不会触发错误消息。因此,您应该做的第一件事是尝试修复您的模式,以便它们实际上与您希望它们匹配的东西匹配,记住您需要匹配整个令牌。
当然,您可以发送部分标记,从而在某种程度上使语法复杂化。要做到这一点,一种方法是使用这样的方法:
0|[1-9][0-9]* { if (yyleng <= 4) return INT_PART;
fprintf(stderr, "%s: Integer part too long\n", yytext);
return BAD_TOKEN;
}
"."[0-9]+ { if (yyleng <= 9) return DEC_PART;
fprintf(stderr, "%s: Decimal part too long\n", yytext);
return BAD_TOKEN;
}但是,您的解析器必须将这两件事结合在一起。解析器实际上不知道这两个部分之间是否有空格,所以这需要更多的工作。注1
就我个人而言,我只是做比赛和稍后检查,以确保两个部分都不是太长。或者将整件事转换成一个浮点数,并将其与10000进行比较,这无疑是最简单的选择。
备注:
.的存在上。所以严格来说,你可以做你想做的事。但是,这是一项很少有意义的工作,其结果将是代码更难维护。https://stackoverflow.com/questions/71850161
复制相似问题