我正在使用我前段时间编写的 PHP 模板引擎。它依赖于正则表达式来创建缓存的 PHP 文件。一些语法示例:

{$foo} - regular variable
{$foo.bar} - variable foo that uses the array key 'bar'
{$foo|uppercase} - modifier 'uppercase' that takes 'foo' and applies some method to it

{iteration:users}
    Hi there {$users.name}
{/iteration: users}

列表还在继续......解析所有这些涉及相当多的令人讨厌的正则表达式。请注意,一个迭代可以在另一个迭代中,依此类推。

最近我看到了像 twig、smarty3 这样的模板引擎,它们使用模板词法分析器。我对此有几个问题:
- 一般来说,词法分析器的方式不是比使用几个正则表达式来创建缓存的 php 模板慢吗?
- 是否有关于如何编写自己的词法分析器来解释某种(模板)语言的好资源(我在谷歌上找不到我理解的任何内容)
- 我应该继续使用正则表达式还是词法分析器值得探索?

最佳答案

我建议编写 Parsing expression grammars (PEGs) ,并查看 this answer 以获取 PHP 中的 PEG 库。

PEG 与正则表达式非常相似,它们本质上是贪婪的,而且从不模棱两可:非常适合领域特定语言 (DSL)。



否:正则表达式的速度取决于正则表达式引擎的实现。通常,每次使用正则表达式时,都需要对其自身进行解析,然后对于给定的模型,它必须使用通用匹配器,该匹配器适用于所有可能的正则表达式。

给定一个词法分析器,你可以微调匹配器:你得到一个特定的匹配器,它只适用于你预定义的语法。一个好处是在 bootstrap 的情况下:不需要编译正则表达式。另一个好处是它的复杂性较低,因为它是特定的匹配器,它往往运行得更快。



词法分析器非常复杂。要编写自己的代码,您必须了解有关 state machinesregular grammar 、上下文无关或非上下文无关语法等的知识。

不过,它需要一些基本的计算机科学知识才能轻松掌握。



值得注意的是精心设计的词法分析器的错误捕获功能(例如,错误消息:“预期 ; ,但发现 ) ,在第 64:38 行。”)

关于php - 我应该使用/编写模板词法分析器吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7106896/

10-12 18:44