flex 词法分析器中的定义 - 如何定义科学记数法

问题描述

我是使用 flex 的新手,需要定义实数,即。 3.1 或 3.0e-10 作为可接受的数字。这是我目前所拥有的:

digit       [0-9]
int     {digit}+
real_literal  ({digit}+)("."{digit}*)

根据我的理解,这适用于小数而不接受 12.52.23 之类的东西

我将如何定义接受科学记数法的数字,例如上面提到的 3.0e-10?

会是这样吗?

real_literal  ({digit}+)("."{digit}*)|({digit}+)("."{digit})[Ee]["-""+"]{digit}+

解决方法

是的,这一次我可以说RTFM! flex 手册在附录 A 中有您想要的模式。

,

一个可能的解决方案,比你的短一点,是:

{digit}+"."{digit}*([eE][-+]?{digit}+)?

分解

  • {digit}+"."{digit} 匹配正实数(它不会识别整数)。
  • (...)? 将下一部分括在括号中,后跟一个问号,使里面的内容成为可选。
  • [eE][-+]?{digit}+ 匹配指数。请注意,- 不会在方括号内转义在这种情况下,因为它是列表的第一个或最后一个字符,正如@rici 指出的那样。

我只是想指出您在这里没有识别负数,但我不知道这是不是故意的。