2

我有一个使用 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())
                            )
                    )

            )
    );
}

}

对我来说,它工作正常。但是对于更复杂的语法会好吗?

4

2 回答 2

1

Parboiled 的作者 Mathias 给出了答案。

http://users.parboiled.org/A-way-of-using-multiple-parsers-in-one-is-this-a-safe-code-td3512129.html#a3518992

一般来说,如果您以这种方式覆盖方法 setContext(),甚至可以使用共享上下文(并且您没有使用 push(p1.pop())):

    public void setContext(Context<V> context) { 
       P1.setContext(context); 
       P2.setContext(context);
       super.setContext(context); 
    } 
于 2011-11-18T16:28:38.480 回答
0

是的,只要解析器产生相同类型的值,就完全没有问题。

即使生成的值的类型不同,这种方法也可以工作,但是您需要跳过一些障碍来转换或转换结果值,但肯定是可能的。

于 2013-10-04T09:47:20.913 回答