我有一个使用 xml 配置文件的应用程序,我在其中描述组件的布局。目前我有 3 种布局:网格、水平和垂直。我想创建一个使用这三个的布局。
最后我找到了一种方法来做到这一点:对于每个布局类,我定义了该布局类的受保护的包保护字段,并在声明中初始化它们。我的一般规则使用这些字段。唯一要记住的是,它们都有自己的堆栈,这不是问题,因为您可以像这样调用代码:push(gridLayoutParser.pop())
.
这是一个使用不同解析器的示例:
第一个子解析器:
public static class P1 extends BaseParser<String> {
public Rule FullContent() {
return Sequence(Content(), EOI);
}
public Rule Content() {
return Sequence(
push(""),
String("STRING1"),
swap() && push(pop() + " fromParser1 "),
String(" SOMESTRING1 ")
);
}
}
第二个是一样的:
public static class P2 extends BaseParser<String> {
public Rule FullContent() {
return Sequence(Content(), EOI);
}
public Rule Content() {
return Sequence(
push(""),
String("STRING2"),
swap() && push(pop() + " fromParser2 "),
String(" SOMESTRING2 ")
);
}
}
这里使用它们的解析器:
公共类 OP 扩展 BaseParser {
protected P1 bool1 = Parboiled.createParser(P1.class);
protected P2 bool2 = Parboiled.createParser(P2.class);
public Rule FullContent() {
return Sequence(
push(""),
OneOrMore(
FirstOf(
Sequence(
bool1.Content(),
swap() && push(pop() + bool1.pop())
),
Sequence(
bool2.Content(),
swap() && push(pop() + bool2.pop())
)
)
)
);
}
}
对我来说,它工作正常。但是对于更复杂的语法会好吗?