为什么要使用词法分析器?

3

我正在使用Flex构建自己的语言,但我想知道一些事情:

  • 为什么要使用词法分析器?
  • 它们会对我有帮助吗?
  • 它们是必需的吗?

当然不是,我没有上课。 - Nathan Campos
@Bruno:阅读他的问题历史记录... - dmckee --- ex-moderator kitten
3个回答

5
词法分析有助于简化解析,因为可以将词素视为抽象实体而不是具体字符序列。
然而,构建语言需要的不仅仅是flex:词法分析只是第一步。

你能展示一段没有Flex简单性的代码示例吗? - Nathan Campos

3
任何时候,当您将输入字符串转换为以空格分隔的字符串和/或数字值时,您都在执行词法分析。编写级联的else if (strcmp(..)==0) ...语句被视为词法分析。即使像sscanf和strtok这样的令人讨厌的工具也是词法分析工具。
您需要使用像flex这样的工具,而不是上述工具之一,原因有以下几点:
  • 错误处理可以更好地实现。
  • 您可以使用flex识别更多不同事物。例如,使用scanf例程正确解析C格式十六进制值很困难。scanf必须“知道”十六进制值即将到来。Lex可以为您找出答案。
  • Lex扫描器更快。如果您正在解析大量文件和/或大型文件,则这可能变得重要。

1
你可以考虑使用词法分析器,因为你可以使用 BNF(或 EBNF)声明式地描述语言(语法),然后只需使用解析器解析用你的语言编写的程序,并将其以结构形式存储到内存中,然后自由地操作它。
这不是强制性的,你当然可以自己编写,但这取决于语言的复杂程度以及你重新发明轮子的时间有多少。
此外,你可以使用一种语言(BNF)来描述你的语言,而不必更改词法分析器本身,这使你能够进行许多实验并改变你的语言的语法,直到你拥有确切适合你的语言。

2
你可以编写自己的词法分析器。然而,要像flex一样做得“正确”,快速和高效,你必须逐个检查每个字符与整个语法中该令牌位置上的每个字符进行比较,直到一个(且仅有一个)被识别。实现这样的状态机最有效的方法是广泛使用goto语句。对于熟悉简单语法并知道自己在做什么的人来说,这可能没问题,但通常最好将这些事情留给工具处理。 - T.E.D.
@T.E.D. 我同意。这就是为什么我说“你有多少时间去重复发明轮子”。无论如何,我肯定不鼓励有人从零开始编写这样的东西。 - Petros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接