除编译器之外编写Lexers和Parser的用途?

时间:2011-09-11 13:46:34

标签: regex parsing lexer

使用Lexers和Parsers可以解决编写编译器以外的哪些问题?

使用Lexers和Parser而不仅仅是用编程语言编写正则表达式语句有什么优点/缺点。

是否存在仅使用Lexer或仅使用Parser的情况?

PS:精确比较示例会很好

2 个答案:

答案 0 :(得分:2)

词汇分析器和解析器适用于context-free language但不是regular language的任何计算机解释。

在更实际的术语中,这意味着它们有助于解释任何具有已定义的结构但超出正则表达式(或更难处理)正则表达式的能力。

例如,difficult如果不是impossible则编写正则表达式,这将确定给定文档是否是有效的HTML(由于标记嵌套,转义字符,必需属性等等)等等)。另一方面,为HTML编写解析器(相对)是微不足道的。

同样,您可能不想甚至尝试编写正则表达式来确定数学表达式中的运算顺序。另一方面,解析器可以轻松完成。


关于个别词法分析器或解析器的问题:

对另一方来说,或者根本不是“必要的”。

例如,人们可以使用人类可读的单词直接转换为机器操作码,这些操作码将直接转换为机器代码(这基本上是一种非常基本的“汇编语言”)。这不需要解析器。

也可以简单地以机器可读的单个符号表示的方式编写程序,因此机器很容易解析 - 例如,仅使用符号0,{{的布尔代数表达式1}},1&|~(。这不需要词法分析器。

或者你也可以没有 - 例如,Brainfuck既不需要也不需要解析,因为它只是一组有序指令;解释器只是将符号映射到要做的事情。同样,机器操作码也不需要。

大多数情况下,词法分析器和解析器的编写是为了使更好更容易。它更好不必在单个单义字形中写入所有内容。 更容易能够以任何方便的方式写出复杂的表达式(例如,使用括号)),而不是强迫自己以机器工作的方式编写它们(比如说,RPN(3+4)*2)。

答案 1 :(得分:0)

一个着名的例子,其中解析比正则表达式更适应(因为the object of processing is, inherently, a non-regular context-free language)是X?(HT)?ML操作。见Jeff Atwood的famous blog post on the subject,源自a famous answer on this site