【问题标题】:Beginner's guide to writing grammar写作语法初学者指南
【发布时间】:2012-01-31 17:58:59
【问题描述】:

我正在使用的应用程序从文件导入中输入大量数据并相应地更新数据库列。我需要提出一个自定义规则引擎,该引擎将根据验证处理所有输入值并相应地执行数据转换。例如

我们的应用程序中的一个字段是产品名称。所以我们需要实现的规则之一是将产品名称从小写转换为大写,如果文件中的输入值是小写的。同样,需要进行许多文本/数学转换。由于这些原因,我们需要提出自定义规则引擎,在其中我们为每个属性定义规则,解析它们然后应用规则。

我知道ANTLRJava 的解析器生成器之一。我正在就以下问题寻求建议:
1> 关于解析器生成器工作的一般信息和实现语法的最佳实践。

2> 由于我需要完全设计这个规则引擎,任何人都可以指出我可以参考的示例规则引擎吗?从 UI 到数据库设计。我将 GWT 用于 UI,Java 用于核心逻辑,oracle 用于数据库

3> 是否还有其他用于 Java 的解析器生成器

4> 虽然我确实想遵循定义自己的语法并使用解析器生成器来构建此规则引擎的路径,但我应该考虑其他方法吗?

【问题讨论】:

  • 语法似乎有点过头了,除非文件在结构上非常复杂,否则语法可能只会让你的生活更艰难。简单的字符串测试、switch 语句等就足够了。
  • 好吧,我们目前的规则只是开始。正如我所说,现在会有字符串/数学转换,所以我不确定当我们有更复杂的进来时,“简单字符串测试,switch 语句”是否会很好地扩展。我不确定 Regex 是否在这里是最好的好
  • 按照您描述问题的方式,不清楚选择要组合的列、选择输出列或对此数据进行任意计算的限制是什么。如果您无法为您被允许做的事情定义一组值得信赖的限制,那么您将需要图灵语言的全部功能(Java 似乎很好);要访问所有列和记录,您可能至少需要 SQL 的强大功能来进行数据访问和更新。你对你愿意计算的内容有明确的限制吗?为什么您认为另一种语言会对您有所帮助?

标签: java antlr parser-generator


【解决方案1】:

您可能想考虑只使用 JbossRules(以前称为 Drools),它是一个基于 Java 的规则引擎。或者,脚本引擎可能是实现规则的另一种方式(例如 Apache Rhino(Java 中的 Javascript))。

在这种情况下自己编写似乎有点过头了,但如果最终用户要创建规则/脚本,它可以让您提供更好的安全保证。

编辑以解决 cmets 中的问题:

我建议使用现有的规则引擎(ala JbossRules/Drools)而不是编写自己的解析器和语法(用于规则组件)。例如看这里:Drools

对于规则可能需要使用的特殊逻辑(数据库访问或计算库),您应该编写一个供您的规则使用的 Java API(这样规则就不会深入访问您的其他代码,因为如果/何时会导致错误你重构)。无论您使用哪种规则引擎(您自己的或现有的),此建议都适用。

我假设您已经解决了数据输入文件的数据格式,并且您只是在寻找规则格式和规则解析的解决方案。

【讨论】:

  • 感谢您的意见。规则引擎将由这里的“功能”人员使用,并且不会在我们的应用程序中公开使用。但我想到了使用解析器生成器,因为 re 可以是转换规则的任何级别的嵌套。你认为解析器生成器是正确的做法吗?
  • 您是建议不使用带有我们自定义语法的规则引擎还是根本不使用规则?
  • @darkie15 更新答案以解决您的问题。
【解决方案2】:

有 JavaCC,它是一个 Parser 生成器,并且有 groovy 用于评估规则。是否要使用脚本引擎取决于语法。如果规则不能用 javascript、java、python 等表达,而你想用一种新的语言编写它们,那么你必须使用解析器生成器。但是你总是可以在你创建的方法中做任何你想做的事情,然后从规则中调用它们。规则将由脚本引擎评估。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2012-07-20
    • 2010-09-23
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多