递归下降解析器详细信息

时间:2014-04-17 03:37:15

标签: java

我的任务是为特定的语法开发一个递归下降解析器。

我正在解析的语言基本上只是添加""到论点的开头和结尾。例如,以下输入:

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。

  • 检测并捕捉花括号内的所有内容。

我相信我有一个递归下降解析器的形式和流程,但如果我在任何事情上都弄错了,请不要犹豫,纠正我。

1 个答案:

答案 0 :(得分:1)

您的解析器应该有一个签名public String parser(StringTokenizer st),然后您可以在递归时简单地传递tokenizer(请记住,在递归当前令牌后将不正确)。然后你可以写return "<top> " + parser(st) + " </top> ";。最后,添加另一个在花开括号上激活的子句,它返回所有标记的连接,包括闭括号。

TBH如果你也在这里复制语法会有所帮助......