首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分析数字和字符串是莱克星的工作吗?

分析数字和字符串是莱克星的工作吗?
EN

Stack Overflow用户
提问于 2011-06-12 04:28:19
回答 3查看 4.5K关注 0票数 37

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

考虑到这一事实,考虑到我问的是lexer是否应该解析输入,这可能听起来很愚蠢。但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了正确地执行lex,lexer首先需要解析字符串/数字,所以如果解析器这样做,代码就会被复制。

这真的是莱克星的工作吗?或者,词汇应该简单地将像123.456这样的字符串拆分为字符串123.456,然后让解析器计算出其余的字符串?用字符串做这件事就不那么简单了.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-12 05:07:57

简单的回答是“是”。

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

您需要词汇,因为使用字符作为原始元素构建的解析器不像解析器那样高效,解析器将输入流分解为“记号”,其中标记是要解析的语言的原始元素(空格、关键字、标识符、数字、运算符、字符串、注释,.)。如果你不关心效率,你可以跳过这个答案的其余部分,去阅读SGLR解析器。

优秀的词汇者通常采用一组表示语言元素的正则表达式,并将它们编译成一个高效的有限状态机,该机器可以快速地将输入流分割成这样的语言元素。(如果您不想使用lexer生成器,对于简单的语言,您可以自己编写FSA代码)。这样的编译后的FSA只执行几十个机器指令每个输入字符(从输入缓冲区获取字符,打开字符到新状态,决定令牌是否完成,如果不再次完成),因此可以非常快。

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

一个人可以停留在那里,并有有用的学者。执行转换步骤通常是有用的,该步骤将字符串转换为该令牌的等效本机值,无论是在收集字符时还是在令牌完成时,因为您仍然了解令牌中涉及的特定字符。这用于将目标语言中的数字(不同基数)转换为其本机二进制等价的数字,将包含转义序列的文字字符串转换为组成字符串的实际字符,甚至获取标识符名并在哈希表中查找它们,以便很容易地确定相同的标识符。解析器通常对这些转换的值不感兴趣,但是除了解析(语义分析、检查优化、代码生成)之外的步骤仍然需要转换值,所以您可以像发现它们一样对它们进行转换。(您可以将此转换延迟到需要它们的二进制值,但实际上您几乎总是需要该值,因此延迟转换不会买到太多钱)。

票数 34
EN

Stack Overflow用户

发布于 2011-06-12 04:36:44

我假设您希望将"123.456“作为一个整体值来处理,在这种情况下,您将把它批发地传递给解析器,除非您需要对其进行编码,例如

代码语言:javascript
复制
struct DecimalRep{
    double mantissa,
    double exponent 

}

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

票数 0
EN

Stack Overflow用户

发布于 2011-06-12 04:41:09

lexer本质上是从输入中标识令牌。在这种情况下,lexer可能会“匹配”该数字作为浮点数标记。解析器本质上处理标记并进行语法分析。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6320132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档