Meh*_*dad 31 parsing tokenize lexer
解析数字和字符串是词法分析员的工作吗?
鉴于我正在询问词法分析器是否应该解析输入,这可能听起来也可能听起来不笨.但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了lex正确,lexer需要首先解析字符串/数字,所以看起来代码会重复,如果解析器执行此操作.
它确实是词法分析员的工作吗?还是应该词法分析器只是分手像串123.456
入串123
,.
,456
并让解析器弄清楚的休息吗?使用字符串这样做不会那么简单......
Ira*_*ter 31
简单的答案是"是".
在摘要中,您根本不需要词法分析器.您可以简单地编写一个使用单个字符作为标记的语法(事实上,这正是SGLR解析器所做的,但这是另一天的故事).
你需要词法分析器,因为使用字符作为原始元素构建的解析器不如将输入流分解为"标记"的解析器那样高效,其中标记是要解析的语言的原始元素(空格,关键字,标识符,数字,运算符) ,字符串,评论,...).[如果您不关心效率,可以跳过本答复的其余部分并阅读有关SGLR解析器的内容].
好的词法分析器通常采用表示语言元素的正则表达式集合,并将它们编译成一个有效的有限状态机,可以快速将输入流分段为这些语言元素.(如果您不想使用词法分析器生成器,对于简单语言,您可以自己编写FSA代码).这样编译的FSA每个输入字符只执行几十个机器指令(从输入缓冲区获取字符,打开字符到新状态,判断令牌是否完整,如果不再执行),因此可以非常快.
这些词法分析器的输出通常是代表langauge元素的代码(如果解析器无论如何都会忽略它,则代码为空白)和一些位置信息(从文件foo,第17行第3列开始)以启用错误报告.
人们可以在那里停下来并拥有有用的词法分子.执行转换步骤通常很有用,可以将字符串转换为该令牌的等效本机值,无论是收集字符还是令牌完成时,因为人们仍然知道所涉及的特定字符.令牌.这用于将目标语言中的数字(不同的基数)转换为它们的本机二进制等价物,将包含转义序列的文字字符串转换为构成字符串的实际字符,甚至将标识符名称转换为在哈希表中查找它们以便容易确定相同的标识符.解析器通常对这些转换后的值不感兴趣,但除了解析(语义分析,检查优化,代码生成)之外的步骤无论如何都需要转换后的值,因此您可以在发现它们时进行转换.(您可以延迟此转换,直到需要它们的二进制值,但实际上您几乎总是需要该值,因此延迟转换并不会非常有用).
归档时间: |
|
查看次数: |
3035 次 |
最近记录: |