解析数字和字符串是词法分析器的工作吗?
这可能听起来很愚蠢,也可能不愚蠢,因为我问的是lexer should parse输入。但是,我不确定这实际上是词法分析器的工作还是解析器的工作,因为为了正确地进行词法分析,词法分析器需要首先解析字符串/数字,因此如果解析器执行此操作,代码似乎会重复。
这确实是词法分析器的工作吗?或者词法分析器应该简单地分解一个字符串,比如123.456
进入弦乐123
, .
, 456
然后让解析器找出剩下的部分?对于字符串来说,这样做不会那么简单......
简单的答案是“是”。
简而言之,您根本不需要词法分析器。您可以简单地编写一个使用单个字符作为标记的语法(事实上,这正是 SGLR 解析器所做的,但这是另一天的故事)。
您需要词法分析器,因为使用字符作为原始元素构建的解析器不如将输入流分解为“标记”的解析器那么高效,其中标记是您正在解析的语言的原始元素(空格、关键字、标识符、数字、运算符) 、字符串、注释……)。 [如果您不关心效率,您可以跳过本答案的其余部分并阅读有关 SGLR 解析器的内容]。
好的词法分析器通常采用表示语言元素的正则表达式集,并将它们编译成高效的有限状态机,该状态机可以快速将输入流分段为此类语言元素。 (如果您不想使用词法分析器生成器,对于简单语言,您可以自己编写 FSA 代码)。这样编译的 FSA 对于每个输入字符仅执行几十条机器指令(从输入缓冲区获取字符,将字符切换到新状态,确定令牌是否完整,如果不完整则再次执行),因此速度非常快。
此类词法分析器的输出通常是表示 langauge 元素的代码(或者如果解析器无论如何都会忽略空格,则没有空格)和一些位置信息(从文件 foo 第 17 行第 3 列开始)以启用错误报告。
人们可以到此为止并拥有有用的词法分析器。执行转换步骤通常很有用,将字符串转换为该令牌的等效本机值,无论是在收集字符时还是在令牌完成时,因为人们仍然了解其中涉及的特定字符。令牌。这用于将目标语言中的数字(不同基数)转换为其本机二进制等效项,将包含转义序列的文字字符串转换为构成字符串的实际字符,甚至获取标识符名称并在哈希表中查找它们以便轻松确定相同的标识符。解析器通常对这些转换后的值不感兴趣,但解析之外的步骤(语义分析、检查优化、代码生成)无论如何都需要转换后的值,因此您最好在发现它们时对其进行转换。 (您可以延迟此转换,直到需要它们的二进制值为止,但实际上您几乎总是需要该值,因此延迟转换并没有多大意义)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)