解析数字和字符串是Lexer的工作吗?

时间:2011-06-12 04:28:19

标签: parsing lexer tokenize

解析数字和字符串是词法分析员的工作吗?

这可能听起来也可能听起来很愚蠢,因为我问的是 lexer 是否解析输入。但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了正确理解lexer需要首先解析字符串/数字,所以它会看起来像解析器这样做会重复代码。

这确实是词法分析员的工作吗?或者词法分析器是否应该将123.456之类的字符串分解为字符串123.456并让解析器找出其余的字符串?用字符串做这件事并不是那么简单......

3 个答案:

答案 0 :(得分:31)

简单的答案是“是”。

在摘要中,你根本不需要词法分析器。你可以简单地编写一个使用单个字符作为标记的语法(事实上,这正是SGLR解析器的作用,但这是另一天的故事)。

你需要词法分析器,因为使用字符作为原始元素构建的解析器不如将输入流分解为“标记”的解析器效率高,其中标记是要解析的语言的原始元素(空格,关键字,标识符,数字,运算符,字符串,注释,...)。 [如果您不关心效率,可以跳过本答复的其余部分并阅读有关SGLR解析器的内容]。

好的词法分析器通常采用表示语言元素的正则表达式集合,并将它们编译成一个有效的有限状态机,可以快速将输入流分段为这些语言元素。 (如果您不想使用词法分析器生成器,对于简单语言,您可以自己编写FSA代码)。这样编译的FSA每个输入字符只执行几十个机器指令(从输入缓冲区获取字符,打开字符到新状态,判断令牌是否完整,如果不再执行),因此可以非常快。

这些词法分析器的输出通常是代表langauge元素的代码(如果解析器无论如何都会忽略空格,也不代表空格)和一些位置信息(从文件foo,第17行第3列开始)以启用错误报告。 / p>

人们可以在那里停下来并拥有有用的词法分析器。执行转换步骤通常很有用,可以将字符串转换为该令牌的等效本机值,无论是收集字符还是令牌完成时,因为人们仍然知道所涉及的特定字符。令牌。这用于将目标语言中的数字(不同的基数)转换为它们的本机二进制等价物,将包含转义序列的文字字符串转换为构成字符串的实际字符,甚至将标识符名称转换为在哈希表中查找它们以便容易确定相同的标识符。解析器通常对这些转换后的值不感兴趣,但除了解析(语义分析,检查优化,代码生成)之外的步骤无论如何都需要转换后的值,因此您可以在发现它们时进行转换。 (您可以延迟此转换,直到需要它们的二进制值,但实际上您几乎总是需要该值,因此延迟转换并不会非常有用)。

答案 1 :(得分:0)

我假设您要将“123.456”视为一个整体值,在这种情况下,您将批量传递给解析器,除非您需要以某种方式对其进行编码,例如

struct DecimalRep{
    double mantissa,
    double exponent 

}

但我想这完全取决于解析器所期望的内容。

答案 2 :(得分:0)

词法分析器基本上从输入中识别出TOKEN。在这种情况下,词法分析器可能会将该数字“匹配”为浮点数TOKEN。解析器实质上处理令牌并进行语法分析