我正在为我们网站的用户编写一个消息传递系统,它实现了分段以允许单个消息针对用户的动态分段。因为给定消息的分段定义可能包含多个单个分段匹配,消息正文的内容也需要分段,我曾尝试通过编写一个定制的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的,因为写这些消息的人将是项目经理和营销人员。
2条答案
按热度按时间jogvjijk1#
自从90年代中期我使用lex & yacc构建C程序以来,我就没有做过任何解析器生成器的工作,但我将提供以下内容--因为我看到您自2012年以来一直没有得到满意的答案或更新您的问题:
但您提出的示例消息提出了一个更大的问题:
解析器生成器发出的PHP代码将如何使用?
具体而言:
在静态页面中嵌入逻辑是一个古老的想法(毕竟服务器端包含在90年代很流行),现代模板引擎(正如Ugo Meda在回答中所建议的)是非常强大的。滚动自己的消息解析+呈现系统是否真的有意义,实际上取决于您在编写"user.modules. *"时所引用的应用程序上下文所施加的约束。在你的例子中。
enxuqcxy2#
不要重复发明轮子。也许你应该使用像Smarty这样的东西来实现它。注意,它应该由可信用户使用,因为它执行代码,这可能是危险的。
如果您不打算实现数百个函数,那么适当的正则表达式应该可以。