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


Searching for Lime parser generator grammar examples... Just cannot find any

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

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

一般来说,当你想要一个解析器生成器发出PHP代码时,看起来lime是yacc的一个好的替代品,但是计算器示例中显示的tokenize()方法是lex的一个极弱的替代品。因此,一般来说,如果您的目标是在"消息"中嵌入编程逻辑位,那么您可以期望"从头开始"编写分词器逻辑是一个挑战(如果消息格式受到高度约束则不那么具有挑战性)。

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

您的

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

具体说来:

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

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

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

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

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

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