【发布时间】: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
我根据语法写代码,但是不知道怎么做{<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()
【问题讨论】:
-
标签帮助不大,看标签说明。
{ <S-exp> }的含义取决于您使用的语法符号的变化。我假设您使用的是ebnf? -
@asynts 没错。我用的是 ebnf。
-
一般风格注释:在 C++ 中,我们通常将
enum用于type,而您目前使用的字符串类似于"LEFT_PAREN"。 -
我建议你不要修改
i,而是使用i+1,i+2,...可变状态很棘手。 (并注意向量的大小。)