我正在学习语言翻译,上半场几乎完成了。我创建了我的标记,并将它们链接到我所追求的流中。
具体来说,令牌是:
enum token_type {
BRACKET_CURLY_LEFT, BRACKET_CURLY_RIGHT,
BRACKET_ROUND_LEFT, BRACKET_ROUND_RIGHT,
ARROW_LEFT, ARROW_RIGHT,
BACKSLASH, FORWARDSLASH,
INTEGER, DECIMAL, INVALID_NUM,
ALLOC, CALL,
FUNCTION, VARIABLE, WORD,
UNDERSCORE,
NULL_SYMB
};
class token {
public:
token(token_type type, const char* value);
virtual ~token();
token_type type;
char* value;
};
我之前在Python中做了一些解释工作,在那里我按照DirectoryInfo.GetFileSystemInfos()和lis.py教程制作了一个Lisp解释器。在lis.py页面上,Norvig写的第一件事是:
def parse(program):
"Read a Scheme expression from a string."
return read_from_tokens(tokenize(program))
def read_from_tokens(tokens):
"Read an expression from a sequence of tokens."
if len(tokens) == 0:
raise SyntaxError('unexpected EOF while reading')
token = tokens.pop(0)
if '(' == token:
L = []
while tokens[0] != ')':
L.append(read_from_tokens(tokens))
tokens.pop(0) # pop off ')'
return L
elif ')' == token:
raise SyntaxError('unexpected )')
else:
return atom(token)
def atom(token):
"Numbers become numbers; every other token is a symbol."
try: return int(token)
except ValueError:
try: return float(token)
except ValueError:
return Symbol(token)
如果我们专门查看read_from_tokens()
函数,它会遍历标记列表并返回标记和数组,这些数组可以包含更多标记和更多数组等。每个列表本质上是模拟( ... )
块。
在我的C ++程序中,我试图通过将我的标记分类为模拟{ ... }
块的数组来模拟这个。现在,如果我们查看Python数组L = []
,它几乎可以存储任何数据类型。 C ++ std::vector
不能。但是可以存储(void*)
。
所以我尝试通过让函数返回类型作为void指针来创建转换,然后返回token
和std::vector<token>
s。然而,我最终得到了一个臃肿的分配错误,可能是由于我的投射。
这可能是我写的最脏的代码......
void* group_tokens(std::vector<token> tokens) {
token tok = tokens.at(0);
tokens.erase(tokens.begin());
if (tok.value == "{") {
std::vector<token> group_arr;
int i = 0;
while ((tokens.at(i).value != ")")) {
std::vector<token>* crawled_arr = (std::vector<token>*) group_tokens(tokens);
group_arr.insert(group_arr.end(), crawled_arr->begin(), crawled_arr->end());
i++;
}
tokens.erase(tokens.begin());
return static_cast<void*>(&group_arr);
} else {
return static_cast<void*>(&tok);
}
}
我跳过翻译错误,因为我写了一个“完美”的程序,不应该创建任何错误:{ test }
。这会导致分配错误。
总而言之,有没有办法可以将这些“任何有价值的”Python列表翻译成C ++数组,我可以从std::vector<token>
获取token
和{{1}} s这是在“可执行”的基础上工作以及“编译”的基础,虽然我在警告游泳?
如果问题被视为过于封闭和狭隘,为了拓宽它,可以将问题视为“如何在C ++中将Python列表编写为数组,其中包含对象和单个对象的向量。