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

Bau*_*man 3 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}
Run Code Online (Sandbox Code Playgroud)

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

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

Pin*_*juh 5

我建议编写解析表达式语法(PEG),并在PHP中查看PEG库的答案.

PEG与正则表达式非常相似,它们本质上是贪婪的,并且从不模棱两可:对域特定语言(DSL)非常有用.

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

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

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

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

词典非常复杂.写你自己的,你必须了解的东西状态机,正规文法,上下文无关的免费的非上下文 grammers等.

它需要一些基础计算机科学知识才能轻松掌握.

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

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