我的任务是为特定语法开发递归下降分析器。
我正在解析的语言本质上只是在一个参数的开头和结尾添加了"。例如,以下输入:
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。我们需要这个,这样我们就可以递归地解析整个字符串。
检测并捕获花括号内的所有内容。
我相信我已经掌握了递归下降分析器的形式和流程,但如果我有任何错误,请毫不犹豫地纠正我。
您的解析器应该有一个签名public String parser(StringTokenizer st)
,然后您可以在递归时简单地传递令牌化器(请记住,递归后当前令牌将不正确)。然后你就可以写return "<top> " + parser(st) + " </top> ";
了。最后,添加另一个在大括号上激活的子句,该子句返回到并包括大括号的所有标记的串联。
TBH如果你也把语法抄在这里会有帮助。。。