我应该使用/写一个模板词法分析器吗?

时间:2011-08-18 11:44:56

标签: php templates token lexer

我正在使用我前段时间写过的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模板的速度方法并不慢吗? - 关于如何编写自己的词法分析器以解释某种(模板)语言(我在谷歌上找不到任何我理解的东西)是否有很好的资源 - 我应该继续使用正则表达式还是值得探索的词法分析器?

1 个答案:

答案 0 :(得分:5)

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

PEG与正则表达式非常相似,它们本质上是贪婪的,并且从不模糊:适用于域特定语言(DSL)。

  

一般情况下,使用一些正则表达式创建缓存的php模板的速度方法不是很慢吗?

否:正则表达式的速度是正则表达式引擎的实现相关。通常,每次使用正则表达式时,都需要自己解析,然后使用给定的模型,它必须使用通用匹配器,它可以与所有正则表达式一起使用。

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

  

是否有很好的资源来编写自己的词法分析器来解释某种(模板)语言(我在谷歌上找不到任何我理解的东西)?

Lexers非常复杂。要编写自己的内容,您必须了解state machinesregular grammar无上下文非上下文语法等内容。

它需要一些基础的计算机科学知识才能很容易掌握。

  

我应该继续使用正则表达式还是值得探索的词法分析器?

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