解析数字和字符串是lexer的工作吗?
考虑到这一事实,考虑到我问的是lexer是否应该解析输入,这可能听起来很愚蠢。但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了正确地执行lex,lexer首先需要解析字符串/数字,所以如果解析器这样做,代码就会被复制。
这真的是莱克星的工作吗?或者,词汇应该简单地将像123.456这样的字符串拆分为字符串123、.、456,然后让解析器计算出其余的字符串?用字符串做这件事就不那么简单了.
发布于 2011-06-12 05:07:57
简单的回答是“是”。
抽象地说,你根本就不需要词汇学习者。您可以简单地编写一个语法,它使用单个字符作为标记(事实上,SGLR解析器就是这样做的,但这是另一天的故事)。
您需要词汇,因为使用字符作为原始元素构建的解析器不像解析器那样高效,解析器将输入流分解为“记号”,其中标记是要解析的语言的原始元素(空格、关键字、标识符、数字、运算符、字符串、注释,.)。如果你不关心效率,你可以跳过这个答案的其余部分,去阅读SGLR解析器。
优秀的词汇者通常采用一组表示语言元素的正则表达式,并将它们编译成一个高效的有限状态机,该机器可以快速地将输入流分割成这样的语言元素。(如果您不想使用lexer生成器,对于简单的语言,您可以自己编写FSA代码)。这样的编译后的FSA只执行几十个机器指令每个输入字符(从输入缓冲区获取字符,打开字符到新状态,决定令牌是否完成,如果不再次完成),因此可以非常快。
这些词汇者的输出通常是表示langauge元素的代码(如果解析器无论如何都不会忽略它,则不表示空格)和一些位置信息(从foo文件开始,第17列),以启用错误报告。
一个人可以停留在那里,并有有用的学者。执行转换步骤通常是有用的,该步骤将字符串转换为该令牌的等效本机值,无论是在收集字符时还是在令牌完成时,因为您仍然了解令牌中涉及的特定字符。这用于将目标语言中的数字(不同基数)转换为其本机二进制等价的数字,将包含转义序列的文字字符串转换为组成字符串的实际字符,甚至获取标识符名并在哈希表中查找它们,以便很容易地确定相同的标识符。解析器通常对这些转换的值不感兴趣,但是除了解析(语义分析、检查优化、代码生成)之外的步骤仍然需要转换值,所以您可以像发现它们一样对它们进行转换。(您可以将此转换延迟到需要它们的二进制值,但实际上您几乎总是需要该值,因此延迟转换不会买到太多钱)。
发布于 2011-06-12 04:36:44
我假设您希望将"123.456“作为一个整体值来处理,在这种情况下,您将把它批发地传递给解析器,除非您需要对其进行编码,例如
struct DecimalRep{
double mantissa,
double exponent
}但我想这完全取决于解析器所期望的内容。
发布于 2011-06-12 04:41:09
lexer本质上是从输入中标识令牌。在这种情况下,lexer可能会“匹配”该数字作为浮点数标记。解析器本质上处理标记并进行语法分析。
https://stackoverflow.com/questions/6320132
复制相似问题