java streamTokenizer解析器

时间:2014-06-28 17:51:37

标签: java parsing

我有以下语法:

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

gui,widgets和radio_button是非终端的。其他人是终端。

我需要解析的陈述是:

Window" test" Radio" r1";

我在java中使用streamtokenizer来进行解析。说到小部件,我需要测试第一行然后测试第二行。我使用nextToken()来获取语句的标记。我想在解析小部件之前保存tokenizer的副本,这样如果第一行失败,我可以使用副本来解析第二行。如何保存副本?

非常感谢。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

StreamTokenizer有一个方法pushBack,可以恢复令牌化程序的状态,以便您可以再次调用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;
     }
 }