我们应该在词法分析器中区分NUMBER中的整数,浮点数和双精度数吗?

时间:2014-04-23 14:08:27

标签: compiler-construction

在编译设计中,人们是否建议创建一个名为“NUMBER”的通用标记类,而不是定义整数,浮点数和双精度数?我应该等到以后再搞清楚吗?

1 个答案:

答案 0 :(得分:0)

与大多数此类问题一样,唯一可能的答案是"它取决于"。但总的来说,除非你在一次通过解析器中进行直接的计算器式解释,否则不需要使用多个数字令牌类型,因为它只会使语法复杂化。

有许多脚本语言只有一种类型的数字(例如awk),因此所有数字标记都在词法分析器中转换为双精度浮点数,并且不需要额外的标记类型。

C / C ++的词法分析器需要能够识别"预处理数字",一个包含各种格式的整数和浮点文字的集合,以及许多不是有效数字的字符串在所有(" 42itous",例如),但不包括字符或布尔常量。预处理完成后,需要解决(或拒绝)这些问题;在那之后,为了区分不同的数字类型,任何语法目的都没有必要,尽管它最终将是代码生成所必需的。

因此,对于relexer(即后预处理词法分析器)来说,产生令牌类型的常数"并不令人惊讶。其语义值包括更详细的类型信息。

在典型的表达式语法中,您将拥有CONSTANT令牌类型,其语义值是变量,包括常量的实际类型和值,或者您将拥有constant非终结符号其产生是具有相应动作的不同令牌类型的列表,其用不变的实际类型和值填充变体语义值。显然,这些策略之间没有太大区别;就个人而言,我几乎总是选择lexer解决方案,但这只是我。

通常很容易坚持像数组声明这样的东西只包含维度的整数文字,强制语法区分整数文字标记和其他文字标记。但是语法并不总是产生错误消息的最佳位置,因为这样的错误;在语义分析期间生成有意义的错误消息可能 更简单。