gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:58:01 26 4
gpt4 key购买 nike

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

考虑到我在询问词法分析器是否应该解析输入这一事实,这可能听起来也可能不愚蠢。但是,我不确定这实际上是词法分析器的工作还是解析器的工作,因为为了正确地进行词法分析,词法分析器首先需要解析字符串/数字,所以看起来代码会重复如果解析器会这样做。

这确实是词法分析器的工作吗?或者词法分析器是否应该简单地将像 123.456 这样的字符串分解为字符串 123.456 并让解析器找出其余的?用字符串做到这一点不会那么简单......

最佳答案

简单的答案是"is"。

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

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

好的词法分析器通常采用一组表示语言元素的正则表达式,并将它们编译成一个高效的有限状态机,可以将输入流快速分割成这样的语言元素。 (如果您不想使用词法分析器生成器,对于简单的语言,您可以自己编写 FSA)。这种编译的 FSA 每个输入字符只执行几十条机器指令(从输入缓冲区获取字符,将字符切换到新状态,确定 token 是否完整,如果不再次执行),因此可以非常快。

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

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

关于parsing - 解析数字和字符串是 Lexer 的工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com