我的任务是为特定的语法开发一个递归下降解析器。
我正在解析的语言基本上只是添加""到论点的开头和结尾。例如,以下输入:
start 'Begin' { top { text {Top of the world} } }
输出:
<start> Begin <top> Top of the world </top> </start>
所以我到目前为止在这里与Parser在一起:
public String parser(String s){
StreamTokenizer st = new StreamTokenizer(new StringReader(s));
String output="";
try {
while (st.nextToken() != st.TT_EOF){
if (st.ttype == st.TT_WORD){
if (st.sval.equals("start")){
st.nextToken();
if (st.nextToken() == '\''){
//I need to get the remaining string that
//we haven't parsed yet to recursively call parser on it.
return "<start>" + st.sval + parser(??) + "</start>";
}
}
if (st.sval.equals("top")){
//Need to get remaining string again
return "<top> " + parser(??) + " </top> ";
}
if (st.sval.equals("text")){
st.nextToken();
if (st.nextToken() == '{'){
//I need to capture everything inside the curly braces
String inside = //Everything inside the curly braces
return inside;
}
}
}
}catch (Exception ex) {}
}
正如您所看到的,我对以下内容感到困难:
在我们删除令牌后获取剩余的字符串。我们需要这个,所以我们可以递归地解析整个String。
检测并捕捉花括号内的所有内容。
我相信我有一个递归下降解析器的形式和流程,但如果我在任何事情上都弄错了,请不要犹豫,纠正我。
答案 0 :(得分:1)
您的解析器应该有一个签名public String parser(StringTokenizer st)
,然后您可以在递归时简单地传递tokenizer(请记住,在递归当前令牌后将不正确)。然后你可以写return "<top> " + parser(st) + " </top> ";
。最后,添加另一个在花开括号上激活的子句,它返回所有标记的连接,包括闭括号。
TBH如果你也在这里复制语法会有所帮助......