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

时间:2012-07-05 09:04:16

标签: php grammar parser-generator segment lime

我正在为我们网站的用户编写一个消息传递系统,该系统实现了分段,允许单个消息定位到用户的动态片段。因为给定消息的段定义可能包含多个单独的段匹配,所以还必须对消息体的内容进行分段。我试图通过编写一个自定义词法分析器/解析器(我甚至不知道词法分析器或解析器)来做到这一点,直到与更有经验的程序员建议的机会建议我看看词法分析器和解析器生成器。我做了一些研究,发现PHP本机Lime解析器生成器似乎是我最好的选择,因为我写的代码是PHP。

我已经查看了计算器示例的语法文件,并且在metagrammar中,(实际上,我花了几个小时分析了大部分源代码),但是我真的遇到了困难。如何构建一个简单的语法文件。有没有人知道任何专门用于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 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

通常,当您希望解析器生成器发出PHP代码时,lime可以替代yacc,但the calculator example中显示的tokenize()方法是一个非常弱的替代lex。所以一般如果你的目标是在“消息”中嵌入一些编程逻辑,那么你可以期望“从头开始”编写令牌化器逻辑是一个挑战(如果消息格式受到高度约束,则更少)。

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

您的解析器生成器将如何使用PHP代码?

具体做法是:

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

  • 如何(PHP)程序状态保持不变?您的示例引用了“user.previouslogin”,它不仅表示页面视图的持久性,还表示某种类型的“会话”。

  • 您建议将标签嵌入标签中的逻辑真的是PHP或Javascript的某种变体,还是真正新的东西?

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

相关问题