2009-11-30 99 views
3

我建立使用Flex我自己的语言,但我想知道的一些事情:为什么使用词法分析器?

  • 我为什么要使用词法分析器?
  • 他们会帮我做点什么吗?
  • 他们是强制性的吗?
+1

作业问题? – 2009-11-30 14:59:12

+0

当然不是,我没有上课。 – 2009-11-30 15:11:28

+0

+1 Por ser brasileiro como eu **;)** – 2009-11-30 15:12:07

回答

5

词法分析有助于简化解析,因为词位可以被视为抽象实体而不是具体字符序列。

不过,您需要的不仅仅是flex来构建您的语言:词法分析只是第一步。

+0

您可以展示一个没有Flex简单代码的例子吗? – 2009-11-30 14:32:14

1

你会考虑使用一个词法分析器,因为你可以使用BNF(或EBNF)来声明性地描述你的语言(语法),然后使用一个解析器来解析用你的语言编写的程序,并将它在一个结构中在内存中,然后自由处理它。

这不是强制性的,你当然可以自己写,但这取决于语言的复杂程度以及需要花费多少时间重新发明轮子。

而且,事实上,你可以使用一种语言(BNF)来描述你的语言,而不改变词法分析器本身,使您可以多次实验,改变你的语言的语法,直到你有什么对你有用。

+2

你可以写自己的词法分析器,是的。然而,要做到这一点*正确*就像flex做的那样,快速且高效,您必须逐个检查每个字符在整个语法中该标记位置的每个字符,直到一个(并且只有一个)被重新识别。通过大量使用goto,最有效地实现像这样的状态机。对于那些知道自己在简单的语法上做什么的人来说,这可能是好的,但通常这些事情最好留给工具。 – 2009-11-30 15:09:36

+0

@ T.E.D。我同意。这就是为什么我说“......你需要多少时间重新发明轮子”。无论如何,我当然不鼓励有人从头开始写这样的东西。 – Petros 2009-11-30 20:07:44

3

无论何时您将输入字符串转换为以空格分隔的字符串和/或数字值,您都在执行词法分析。编写级联系列的else if (strcmp (..)==0) ...语句算作词法分析。即使像sscanf和strtok这样讨厌的工具也是词法分析工具。

你想使用类似上面的弯曲,而不是一个工具有以下几个原因之一:

  • 错误处理可制成好得多。
  • 您可以更灵活地使用flex识别不同的事物。例如,用scanf例程很难正确解析C格式的十六进制值。 scanf几乎不得不知道十六进制值正在提交。 Lex可以为你解决这个问题。
  • Lex扫描仪速度更快。如果您正在解析大量文件和/或大文件,这可能变得很重要。