递归下降分析器详细信息



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

我正在解析的语言本质上只是在一个参数的开头和结尾添加了"。例如,以下输入:

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如果你也把语法抄在这里会有帮助。。。

相关内容

最新更新