Scala 动态创建parboiled2规则
我可以在parboiled2解析器中动态生成规则吗?用例是,我已经定义了一堆规则,但希望添加更多,而不是每次添加规则时都进行编译 如果您想在运行时生成规则(就像您在Parboiled1中所做的那样),这是不可能的。Parboach 2正在使用marco表达式,因此无法在运行时生成规则。所有的事情都发生在编译阶段 如果您有许多已定义的规则,并且希望以任意顺序组合它们,即使其中一些规则缺失。这是可能的。我做到了 有两个已知的选项,您可以如何实现这一点: 第一个选项(我还没有尝试过)称为Scala 动态创建parboiled2规则,scala,parboiled2,Scala,Parboiled2,我可以在parboiled2解析器中动态生成规则吗?用例是,我已经定义了一堆规则,但希望添加更多,而不是每次添加规则时都进行编译 如果您想在运行时生成规则(就像您在Parboiled1中所做的那样),这是不可能的。Parboach 2正在使用marco表达式,因此无法在运行时生成规则。所有的事情都发生在编译阶段 如果您有许多已定义的规则,并且希望以任意顺序组合它们,即使其中一些规则缺失。这是可能的。我做到了 有两个已知的选项,您可以如何实现这一点: 第一个选项(我还没有尝试过)称为Dynamic
DynamicRuleDispatch
,您可以在中找到它并查看它的测试
第二个选项是手动生成分派(正如我所做的那样)
capture
+~
+run
bundle来实现这一点,请查看下面的示例:
def RuleWithSideEffect=规则{
捕获(EmailAddress)~run{address:String=>
saveItSomewhere(地址)
}~EOIdispatchRule
方法。然后将字符串标记列表映射到规则
当您有规则列表时,需要执行以下操作:
// concatenates two rules. Must be inside rule block
def concatRules(f: Rule0, s: Rule0): Rule0 = rule {
f ~ s
}
val rootRule =
stringTokens map dispatchRule reduce concatRules
def RootRule: Rule0 = rule { mainRule ~ EOI }
def dispatchRule(token: String): Rule0 = match token {
case "DATE" => DateParser.DateRule
....
}
您可以通过在解析器构造函数中使用logformat来解析Generator访问日志。因此,您需要某种数据模型来验证规则。我认为它们大量使用宏,因此我假设您无法在运行时动态创建宏。
添加更多,而不是每次添加规则时都进行编译。
为什么重新编译会让您担心?