常规vs LALR(1):什么更快

时间:2013-01-25 23:45:52

标签: regex parsing lalr

假设我们有两个语法定义相同的语法:常规语法和LALR(1)语法。

常规算法和LALR(1)算法都是O(n),其中n是输入长度。

通常首选Regexp来解析常规语言。为什么?是否有正式的证据(或者可能很明显)它们更快?

3 个答案:

答案 0 :(得分:2)

解析和识别之间存在很大差异。虽然你可以构建一个常规语言解析器,但它会非常有限,因为大多数有用的语言都不能用一个有用的明确的常规语法来解析。但是,大多数(如果不是全部)正则表达式库识别,可能会添加有限数量的“捕获”。

无论如何,解析真的不再是性能瓶颈。恕我直言,使用可以解析他们似乎解析的语言的工具要好得多。

另一方面,如果您只想识别一种语言 - 并且语言恰好是常规的 -​​ 正则表达式更容易,并且需要更少的基础结构(解析器生成器,专用DSL,稍微更复杂的Makefile等。)

(作为非常规语言特征的一个例子,我给你:圆括号。)

答案 1 :(得分:1)

你应该更喜欢无下载自动机而不是下推式自动机,因为对于常规语言自动机有更多的数学开发。

我们能够对两种类型的自动机执行确定,但我们无法有效地最小化PDA 。众所周知的事实是,对于每个PDA,存在与唯一状态相同的PDA。这意味着我们应该根据转换计数/最大堆栈深度/其他一些标准来最小化它。

另外,检查两个不同的PDA是否与他们识别的语言相同的问题是不可判定的。

答案 2 :(得分:0)

人们更喜欢正则表达式,因为它们更容易编写。如果您的语言是常用语言,为什么还要为它创建CFG语法呢?