我有一个使用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())
)
)
)
);
}
}
对我而言,它运作正常。但对于更复杂的语法会没用吗?
答案 0 :(得分:1)
答案由Parboiled作者Mathias提供。
通常,如果以这种方式覆盖方法setContext(),甚至可以使用共享上下文(并且没有使用push(p1.pop())):
public void setContext(Context<V> context) {
P1.setContext(context);
P2.setContext(context);
super.setContext(context);
}
答案 1 :(得分:0)
是的,只要解析器生成相同类型的值,就没有任何问题。
即使生成的值的类型不同,这种方法也会起作用,但是你需要通过一些箍来转换或转换结果值,但肯定是可能的。