【问题标题】:How to do { <S-exp> }?{ <S-exp> } 怎么做?
【发布时间】:2021-05-03 10:07:37
【问题描述】:

我要检查输入是否正确。

这是语法:

<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

我根据语法写代码,但是不知道怎么做{&lt;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()

【问题讨论】:

  • 标签帮助不大,看标签说明。 { &lt;S-exp&gt; } 的含义取决于您使用的语法符号的变化。我假设您使用的是ebnf?
  • @asynts 没错。我用的是 ebnf。
  • 一般风格注释:在 C++ 中,我们通常将 enum 用于 type,而您目前使用的字符串类似于 "LEFT_PAREN"
  • 我建议你不要修改i,而是使用i+1i+2,...可变状态很棘手。 (并注意向量的大小。)

标签: c++ scheme ebnf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2017-01-05
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多