首页 > 解决方案 > 怎么做 {}?

问题描述

我要检查输入是否正确。

这是语法:

<S-exp> ::= <ATOM> 
            | LEFT-PAREN <S-exp> { <S-exp> } [ DOT <S-exp> ] RIGHT-PAREN
            | QUOTE <S-exp>
            
<ATOM>  ::= SYMBOL | INT | FLOAT | STRING 
            | NIL | T | LEFT-PAREN | RIGHT-PAREN

我根据语法编写代码,但我不知道该怎么做{<S-exp}

我尝试了太多次,但我的代码仍然不正确。

我的代码:

bool Atom( vector<TokenList> token, int i ) {
    return (token[i].type == "SYMBOL" || token[i].type == "INT" || token[i].type == "FLOAT" || token[i].type == "STRING" ||
        token[i].type == "NIL" || token[i].type == "T" || token[i].type == "LEFT_PAREN" || token[i].type == "RIGHT_PAREN");
} // Atom()

bool check = false;
bool Sexp(vector<TokenList> token, int i) {
    if (token[i].type == "LEFT_PAREN") {
        i++;
        if (Sexp(token, i)) {
               // How to do { <S-exp> } ?
        } // if
        else return false;
        
        i++;
        if (token[i].type == "DOT") {
            i++;
            check = Sexp(token, i);
            if (check == false)
                return false;
        } // if
        
        if (token[i].data == ")")
            return true;
        else
            return false;
    } // if
    
    else if (token[i].type == "QUOTE") {
        i++;
        return Sexp(token, i);
    } // else if
    

    else if (Atom(token, i)) {
        return true;
    } // if
    else return false;
} // Sexp()

标签: c++schemeebnf

解决方案


您的假设似乎植根于Sexp(token, i). 看来您的测试token[i]本身是否是S-exp?但这不是语法所说的:anS-exp可以是多个标记。

可能是我误解了你的意思Sexp(token,i)。另一种解释是“S-exp 令牌是否开始于token[i]”?这是一个合理的问题,但通常该问题有第二部分:“如果是这样,那么结束位置是j什么?”。你只是返回 a bool,所以这不是我阅读你的代码的方式。


推荐阅读