我有以下语法:
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的副本,这样如果第一行失败,我可以使用副本来解析第二行。如何保存副本?
非常感谢。我非常感谢你的帮助。
答案 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;
}
}