php - 我应该使用/编写模板词法分析器吗

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

最佳答案

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

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

In general isn't the lexer way slower than using a few regexes to create a cached php template?

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

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

Are there good resources on how to write your own lexer to interpret some sort of (template) language (I couldn't find anything I understand on google)?

词法分析器非常复杂。要自己编写,您必须了解有关 state machines 的内容, regular grammar上下文无关非上下文无关语法等

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

Should I keep using regexes or is a lexer something worth exploring?

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

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

相关文章:

PHP/Mysql 数字格式化

c++ - 获取模板,模板类型

c++ - 在 std::vector 上存储带有模板的类实例

php - 从零开始设计/实现 MVC

javascript - php ajax如何发送消息的字符数

php - 你如何验证一个属性是否可以在 php 中访问?

c++ - 专门处理 std::string 和 char[] 参数的模板成员函数

python - "CSRF verification failed. CSRF token missing or incorrect." Django

swift - 匹配 Swift 中全文搜索的所有标记