2011-11-16 47 views
1

我有一個使用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

是的,只要解析器產生相同類型的值是沒有問題的。

即使產生的值的類型不同,這種方法也可以工作,但是您需要跳過一些環節來轉換或轉換結果值,但這肯定是可行的。

相關問題