Parsing 在哪里处理浮点数的解析-扫描程序还是解析器?

Parsing 在哪里处理浮点数的解析-扫描程序还是解析器?,parsing,floating-point,bison,flex-lexer,Parsing,Floating Point,Bison,Flex Lexer,我正在设计一种小型领域专用语言。 作为扫描仪/解析器生成器,我使用Flex/Bisonc++。 现在,生成的DSL编译器前端能够解析八进制、十进制和十六进制数字。 唯一剩下的是对浮点数(FPN)的支持,如C/C++所示 这里有一个用于浮点数语法的RegExp a) 我知道可以在扫描仪或/和解析器中进行解析, 但我不知道在性能和效率方面什么是最好的 b) 另一个约束是,我希望避免多次接触输入的每个字符,即,我希望避免使用STL或其他字符串到浮点转换函数 通过在解析过程中实现动态转换。 这可能吗?

我正在设计一种小型领域专用语言。 作为扫描仪/解析器生成器,我使用Flex/Bisonc++。 现在,生成的DSL编译器前端能够解析八进制、十进制和十六进制数字。 唯一剩下的是对浮点数(FPN)的支持,如C/C++所示

这里有一个用于浮点数语法的RegExp

a) 我知道可以在扫描仪或/和解析器中进行解析, 但我不知道在性能和效率方面什么是最好的

b) 另一个约束是,我希望避免多次接触输入的每个字符,即,我希望避免使用STL或其他字符串到浮点转换函数 通过在解析过程中实现动态转换。
这可能吗?

让扫描器(
flex
code)识别和转换浮点数是完全可行的,而且通常是明智的,就像它应该识别和转换整数一样。如果您在语法(
bison
code)中而不是在扫描仪中编写了整数识别代码,那么您可能也在那里编写了浮点识别代码,但这不是通常的方式。您可能需要为令牌类型使用更复杂的(读取“复杂”)数据类型;请阅读
%union

整数识别驻留在扫描仪中,FPN识别也应该根据干净的设计进行。很抱歉,没有明确以下内容:虽然我可以在扫描仪中实现它,但它会给扫描仪规范带来很多复杂性(涉及大量状态处理),而解析器中的实现可能更容易。然而,由于整数识别驻留在扫描仪中,因此FPN识别也应该具有干净的设计。我必须做出决定的问题是:执行性能如何?基于扫描仪还是基于解析器的FPN识别速度更快?忽略性能;您可能无法测量差异。如果可以,那是因为扫描仪处理FPN识别时语法代码较小(语法不必处理混乱)。如果您将FPN识别放在语法中,扫描器必须将
-23.00456E+34
作为5个单独的标记返回(
-23
00456
E
+34
),保留前导零。有时您必须对字符进行两次处理;回推是不可避免的(例如,您需要读取数字末尾以外的一个字符才能知道您已到达末尾)。