没有正则表达式的词法分析


9

我一直在用各种高级语言(PythonPHPJavascript等)查看一些词法分析器,它们似乎都以一种或另一种形式使用正则表达式。尽管我确定正则表达式可能是实现此目的的最佳方法,但我想知道是否有任何方法可以在没有正则表达式的情况下实现基本词法分析,也许是某种直接的字符串解析等。

是的,是否可以在不使用任何形式的正则表达式的情况下,以更高级的语言*实现某种基本词汇?

*高级语言是Perl / PHP / Python / Javascript等。我敢肯定,有一种方法可以用C语言实现


2
似乎“是否有一本关于微积分的书没有使用所有那些希腊字母和怪异的波浪状的东西?”
凯文·克莱恩

@kevincline当天空中有完美的飞机时,为什么人们要穿越大西洋?
涂抹

1
划船和骑马有不同的副作用。
凯文·克莱恩

Answers:


3

首先,自从发明“高级”语言以来,就已经有C的正则表达式库。只是说,C程序并不像某些人认为的那样笨拙。

对于大多数语法而言,词汇化是一个搜索空白和其他字符的问题,例如()[] {};。拆分单词,然后与关键字列表进行匹配以查看是否匹配。


1
我并不是说C无法做正则表达式,而是意味着它具有更强大的功能来执行此类操作。我以为用C语言构建高级和高性能的词法分析器要比使用高级语言要容易得多。
涂抹

1
@sam语法分析器或解析器的复杂性和性能更多地取决于所解析语言的复杂性,而不是解析器所实现的语言。
jk。

+1。一个词法分析器非常简单;您只需要一个字符串,令牌的数据类型和预定义关键字表即可。最棘手的部分是处理空格和评论:P
Mason Wheeler'2


1

关于正则表达式没有具体规定。它们只是简写,使您可以更轻松地生成代码,并且通常附带实现。但是,从根本上讲,词法分析器是FSM,而正则表达式只是实现该目标的一种方法。


0

当然,您也可以使用其他解析器,因为每种常规语言都是上下文无关的。问题实际上归结为您为什么要这么做。

没有什么比正则表达式更简单的了(如何改进O(N)?),尝试简化将无济于事。尽管我建议尽可能避免使用Jetti指出的方法,但您始终可以使用简单的回溯。

如果您打算使用更高级的解析器进行词法分析,那么您可能根本不需要词法分析阶段。实际上,我们进入词法分析阶段的原因是,解析词法化标记比解析字符要快得多,并且大大简化了解析步骤。因此,通过使用更高级的解析器,您首先会完全失去词法化的所有好处。


那么正则表达式是如何做到的?它是否还不必一个字一个字地走(至少对于大多数词法中使用的模式)?
杰蒂2012年

@Jetti是的,当然。
Pubby 2012年

读取每个字符然后回退(如果需要提取令牌)将同样容易。这将是更多的代码,但不会更困难。
杰蒂2012年

@Jetti我看不到天真的回溯更好。
Pubby 2012年

我从来没有说更好。但是OP询问是否还有其他方法,这是不是高级解析器的另一种方法。
杰蒂2012年

0

用正则表达式进行词法分析,或者完全跳过这一步,并使用PEG或GLR进行更灵活,功能更强大的无词法分析,是有意义的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.