我一直在用各种高级语言(Python,PHP,Javascript等)查看一些词法分析器,它们似乎都以一种或另一种形式使用正则表达式。尽管我确定正则表达式可能是实现此目的的最佳方法,但我想知道是否有任何方法可以在没有正则表达式的情况下实现基本词法分析,也许是某种直接的字符串解析等。
是的,是否可以在不使用任何形式的正则表达式的情况下,以更高级的语言*实现某种基本词汇?
*高级语言是Perl / PHP / Python / Javascript等。我敢肯定,有一种方法可以用C语言实现
我一直在用各种高级语言(Python,PHP,Javascript等)查看一些词法分析器,它们似乎都以一种或另一种形式使用正则表达式。尽管我确定正则表达式可能是实现此目的的最佳方法,但我想知道是否有任何方法可以在没有正则表达式的情况下实现基本词法分析,也许是某种直接的字符串解析等。
是的,是否可以在不使用任何形式的正则表达式的情况下,以更高级的语言*实现某种基本词汇?
*高级语言是Perl / PHP / Python / Javascript等。我敢肯定,有一种方法可以用C语言实现
Answers:
首先,自从发明“高级”语言以来,就已经有C的正则表达式库。只是说,C程序并不像某些人认为的那样笨拙。
对于大多数语法而言,词汇化是一个搜索空白和其他字符的问题,例如()[] {};。拆分单词,然后与关键字列表进行匹配以查看是否匹配。
您可能对“无扫描程序解析器”感兴趣,该解析器没有单独的标记化步骤。本文开头对无扫描器解析器的好处进行了一种解释:无扫描器广义LR解析器的消歧过滤器。(不过也有缺点。)
(在其他答案中已经提到的PEG,也可以用于构建无扫描仪的解析器。)
当然,您也可以使用其他解析器,因为每种常规语言都是上下文无关的。问题实际上归结为您为什么要这么做。
没有什么比正则表达式更简单的了(如何改进O(N)?),尝试简化将无济于事。尽管我建议尽可能避免使用Jetti指出的方法,但您始终可以使用简单的回溯。
如果您打算使用更高级的解析器进行词法分析,那么您可能根本不需要词法分析阶段。实际上,我们进入词法分析阶段的原因是,解析词法化标记比解析字符要快得多,并且大大简化了解析步骤。因此,通过使用更高级的解析器,您首先会完全失去词法化的所有好处。