2

我正在为我们网站的用户编写一个消息传递系统,它实现了分段以允许单个消息针对用户的动态段。因为给定消息的段定义可能包含多个单独的段匹配,所以消息正文的内容也必须被分段。我试图通过编写一个自定义词法分析器/解析器(我什至不知道词法分析器或解析器)来做到这一点,直到与一位更有经验的程序员的一次偶然对话建议我看看词法分析器和解析器生成器。我做了一些研究,发现 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,因为编写这些消息的人将是项目经理和营销人员。

4

2 回答 2

1

自 90 年代中期以来,当我使用lex 和 yacc构建 C 程序时,我没有做过任何解析器生成器工作,但我会提供这个 - 因为我看到您自 2012 年以来没有得到满意的答案或更新您的问题:

一般而言,当您希望解析器生成器发出 PHP 代码时, lime似乎可以替代 yacc,但计算器示例中显示的 tokenize() 方法是 lex 的极弱替代品。因此,一般而言,如果您的目标是在“消息”中嵌入一些编程逻辑,那么您可以期望“从头开始”编写标记器逻辑是一个挑战(如果消息格式受到高度限制,则情况会更糟)。

但是您提出的示例消息提出了更大的问题:

解析器生成器要发出的 PHP 代码究竟将如何使用?

具体来说:

  • 这些解析器生成的代码块是否是“独立”网页 - 可通过 URL 直接寻址并由网络服务器直接呈现(在这种情况下,下一个问题是您将如何告诉网络服务器执行 PHP 代码,例如通过使将它们转换为 CGI 脚本)?或者它们会在某种应用程序框架(或“消息渲染器”)中运行吗?

  • (PHP) 程序状态将如何持久化?您的示例指的是“user.previouslogin”,这表明不仅跨页面视图而且还包括某种“会话”的持久性。

  • 您提议在标签内的消息中嵌入的逻辑真的是 PHP 或 Javascript 的某种变体,还是真正新的东西?

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

于 2014-01-29T14:56:54.950 回答
0

不要重新发明轮子。也许你应该使用Smarty 之类的东西来实现它。请注意,这应该由受信任的用户使用,因为它执行代码,这可能很危险。

如果您不打算实现数百个功能,那么适当的正则表达式应该可以解决问题。

于 2012-07-05T10:14:57.927 回答