首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在flex中限制整数和十进制零件长度

问在flex中限制整数和十进制零件长度
EN

Stack Overflow用户
提问于 2022-04-12 23:23:55
回答 1查看 54关注 0票数 0

是否可以提取“.”之前和之后的数字数?在Flex的浮子里?我希望将整数部分中的数字数限制为4,小数部分的数字限制为8,以便字符的总数包括'.‘。最多可达13。

我就是这样做的:

代码语言:javascript
复制

只有在浮动长度超过13的情况下,我才会得到错误。但是,当它的整数部分超过4个字符,小数部分超过8个字符时,我没有任何错误。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 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进行比较,因此不会触发错误消息。因此,您应该做的第一件事是尝试修复您的模式,以便它们实际上与您希望它们匹配的东西匹配,记住您需要匹配整个令牌。

当然,您可以发送部分标记,从而在某种程度上使语法复杂化。要做到这一点,一种方法是使用这样的方法:

代码语言:javascript
复制
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进行比较,这无疑是最简单的选择。

备注:

  1. ,您可以使用lexer状态--“开始条件”--只允许在识别整数部分之后立即使用十进制部分规则。你甚至可以把所有的条件都建立在.的存在上。所以严格来说,你可以做你想做的事。但是,这是一项很少有意义的工作,其结果将是代码更难维护。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71850161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档