php 正在搜索Lime解析器生成器语法示例...只是找不到任何

hk8txs48  于 2022-12-21  发布在  PHP
关注(0)|答案(2)|浏览(101)

我正在为我们网站的用户编写一个消息传递系统,它实现了分段以允许单个消息针对用户的动态分段。因为给定消息的分段定义可能包含多个单个分段匹配,消息正文的内容也需要分段,我曾尝试通过编写一个定制的lexer/parser来实现这一点(我甚至不知道词法分析器或解析器),直到一次与一位更有经验的程序员的偶然交谈建议我看看词法分析器和解析器生成器。我做了一些研究,发现PHP原生Lime解析器生成器似乎是我的最佳选择,因为我正在编写的代码是PHP。
我已经查看了计算器示例的语法文件和元语法,(事实上,我已经花了几个小时分析大部分源代码)但是我真的很难理解如何构造一个简单的语法文件。有没有人知道任何专门针对Lime的语法文件示例,因为在我们看来它有自己的语法定义,而不是Lemon或其他PG的数据。
如果你愿意并且能够提供具体的例子,我将特别尝试用类似下面的格式来编写条件句:

This is a text block all users will see.

{{IF user.modules.sms}}
This is a text block only visible to users with the sms module enabled
{{/IF}}

{{IF user.modules.anothermodule AND user.previouslogin < (now() - 3600)}}
This is a text block only visible to users with the anothermodule module enabled, whose previous login was more than an hour ago
{{/IF}}

或者只是一般来说,如果任何人有任何关于实现这样一个功能的其他可能方法的建议,我很乐意接受建议!只是记住它是不可能使用PHP的,因为写这些消息的人将是项目经理和营销人员。

jogvjijk

jogvjijk1#

自从90年代中期我使用lex & yacc构建C程序以来,我就没有做过任何解析器生成器的工作,但我将提供以下内容--因为我看到您自2012年以来一直没有得到满意的答案或更新您的问题:

  • 一般来说 ,当您希望解析器生成器发出PHP代码时,lime似乎是yacc的合适替代品,但是标记化the calculator example中所示的()方法是lex的一个非常弱的替代方法,因此, 一般来说 *,如果您的目标是将编程逻辑嵌入到"消息"中,那么您可以预期"从头开始"编写tokenizer逻辑将是一个挑战(如果消息格式受到高度约束,则情况就不那么严重)。

但您提出的示例消息提出了一个更大的问题:
解析器生成器发出的PHP代码将如何使用?
具体而言:

  • 这些解析器生成的代码块是"独立的"网页吗?通过URL直接寻址,并由Web服务器直接呈现(在这种情况下,下一个问题是如何告诉Web服务器执行PHP代码,例如,通过将它们制作成CGI脚本)?或者它们将在某种应用程序框架(或"消息呈现器")中运行?
  • 如何持久化(PHP)程序状态?您的示例引用了"user.previouslogin",这意味着持久化不仅跨页面视图,还跨某种"会话"。
  • 您建议嵌入到消息中的标记内的逻辑真的是PHP或Javascript的某种变体,还是真正的新东西?

在静态页面中嵌入逻辑是一个古老的想法(毕竟服务器端包含在90年代很流行),现代模板引擎(正如Ugo Meda在回答中所建议的)是非常强大的。滚动自己的消息解析+呈现系统是否真的有意义,实际上取决于您在编写"user.modules. *"时所引用的应用程序上下文所施加的约束。在你的例子中。

enxuqcxy

enxuqcxy2#

不要重复发明轮子。也许你应该使用像Smarty这样的东西来实现它。注意,它应该由可信用户使用,因为它执行代码,这可能是危险的。
如果您不打算实现数百个函数,那么适当的正则表达式应该可以。

相关问题