2014-06-28 66 views
0

我有以下語法:的java StreamTokenizer極解析器

gui ::= 
    Window String widgets 
widgets ::= 
    Button STRING ';'| 
    radio_button End ';' 
radio_button ::= 
    Radio String ';' 

GUI,窗口小部件和radio_button是非終端。其他人是終端。

我需要解析的語句是:

窗口 「測試」 無線 「R1」;

我在java中使用streamtokenizer來進行解析。當涉及到小部件時,我需要測試第一行然後測試第二行。我使用nextToken()來獲取語句的標記。我想在解析窗口部件之前保存一個標記器的副本,這樣如果第一行失敗,我可以使用該副本來解析第二行。如何保存副本?

非常感謝。我非常感謝你的幫助。

回答

1

StreamTokenizer有一個方法pushBack其恢復tokenizer的狀態,以便可以再次調用nextToken(),不跳過的第一次嘗試不匹配的令牌。

if(st.nextToken() == st.TT_WORD && "Button".equals(st.sval){ 
    // deal with Button STRING ';' 
} else { 
    st.pushBack(); 
    if(radioButton()){ // call method to recognize Radio String ';' 
     // handle End ; 
     // ... 
    } else { 
     // error handling 
    } 
} 


boolean radioButton(){ 
    if(st.nextToken() == st.TT_WORD && "Radio".equals(st.sval){ 
     // continue to match String ';' 
     // ... 
     return true; 
    } else { 
     st.pushBack(); 
     return false; 
    } 
} 
+0

嗨@laune! 'pushBack'方法的Javadoc爲:_「導致下一次調用此標記器的nextToken方法以返回ttype字段中的當前值,而不是修改nval或sval字段中的值。」真的不理解「,並且不要修改nval或sval字段中的值。更簡單地說,這是否意味着調用「pushBack」向後移回令牌指針,以便調用「nextToken(); pushBack(); nextToken()」相當於調用一次「nextToken()」? –

+1

這些字段仍然包含nextToken之後存儲的內容,pushBack推回的內容。是的,給你的Q. – laune