2014-06-28 31 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