【问题标题】:Should I use/write a template lexer我应该使用/编写模板词法分析器吗
【发布时间】:2011-08-18 11:44:55
【问题描述】:

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

【问题讨论】:

  • 我知道这不是主题,但是如果您的模板引擎使用逻辑,它的意义何在?你有迭代,你有变量,你有数组,你有使变量大写的修饰符。为什么在 PHP 之上添加另一个层?甚至语法看起来都与 PHP 相似。
  • PHP 是 PHP 最好的模板引擎。在 PHP 中,您有迭代、变量、数组、函数、条件、第三方库、与数据库的连接等。语法与 PHP 完全匹配 :) 说真的,所有模板引擎都很好,但正确实现的 MVC 很多可维护和可扩展。
  • 在我工作的公司,模板是由设计师编写的。起初我们尝试使用 php 本身,但相信我,这几乎不是一个选择。大多数设计师可以编写 html/css 和一些健壮的模板语言。

标签: php templates token lexer


【解决方案1】:

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

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

一般来说,词法分析器的方式不是比使用一些正则表达式来创建缓存的 php 模板慢吗?

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

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

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

词法分析器相当复杂。要编写自己的内容,您必须了解有关 state machinesregular grammarcontext-freenon-context-free 语法等的知识。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2010-12-21
    • 2012-01-15
    相关资源
    最近更新 更多