编程语言
首页 > 编程语言> > php – 我应该使用/编写模板词法分析器吗?

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

作者:互联网

我正在使用我前段时间写过的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),并在PHP中查看this answer的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?

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

标签:lexer,php,templates,token
来源: https://codeday.me/bug/20190903/1795129.html