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模板慢? - 有关如何编写自己的词法分析器来解释某种(模板)语言的好资源(我在谷歌上找不到任何我理解的东西) - 我应该继续使用正则表达式还是值得探索的词法分析器?
我建议编写解析表达式语法(PEG),并在PHP中查看PEG库的答案.
PEG与正则表达式非常相似,它们本质上是贪婪的,并且从不模棱两可:对域特定语言(DSL)非常有用.
一般来说,使用一些正则表达式来创建缓存的php模板的速度方法不是很慢吗?
否:正则表达式的速度是依赖于正则表达式引擎的实现.通常,每次使用正则表达式时,都需要自己解析,然后使用给定的模型,它必须使用一般匹配器,它可以与所有正则表达式一起使用.
给定一个词法分析器,你可以对匹配器进行微调:你得到一个特定的匹配器,它只适用于你预定义的语法.一个好处是在引导程序中:无需编译正则表达式.另一个好处是它的复杂性较低,因为它的特定匹配器往往运行得更快.
是否有很好的资源如何编写自己的词法分析器来解释某种(模板)语言(我在谷歌上找不到任何我理解的东西)?
词典非常复杂.写你自己的,你必须了解的东西状态机,正规文法,上下文无关的或免费的非上下文 grammers等.
它需要一些基础计算机科学知识才能轻松掌握.
我应该继续使用正则表达式还是值得探索的词法分析器?
值得注意的是精心设计的词法分析器的错误捕获功能(例如错误信息:"预期;
,但)
在第64:38行找到.")