将Python列表转换为C ++数组

时间:2016-09-24 00:18:02

标签: python c++ arrays vector

我正在学习语言翻译,上半场几乎完成了。我创建了我的标记,并将它们链接到我所追求的流中。

具体来说,令牌是:

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指针来创建转换,然后返回tokenstd::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列表编写为数组,其中包含对象和单个对象的向量。

0 个答案:

没有答案