Esempio n. 1
0
void lex_parse_test(char *buf, char *toks[])
{
    Lex l;
    int tok;
    int newline = 1;

    if (!buf || !(l = lex_create(buf, toks)))
        return;

    while ((tok = lex_next(l)) != LEX_EOF) {
        assert(lex_prev(l) == tok);
        if (newline) {
            printf("%3d: ", lex_line(l));
            newline = 0;
        }
        switch(tok) {
        case LEX_ERR:
            printf("ERR\n");
            newline = 1;
            break;
        case LEX_EOL:
            printf("EOL\n");
            newline = 1;
            break;
        case LEX_INT:
            printf("INT(%d) ", atoi(lex_text(l)));
            break;
        case LEX_STR:
            printf("STR(%s) ", lex_text(l));
            break;
        default:
            if (tok < LEX_TOK_OFFSET)
                printf("CHR(%c) ", lex_text(l)[0]);
            else if (toks)
                printf("TOK(%d:%s) ", tok, toks[LEX_UNTOK(tok)]);
            else
                printf("\nINTERNAL ERROR: line=%d, tok=%d, str=\"%s\"\n",
                    lex_line(l), lex_prev(l), lex_text(l));
            break;
        }
    }
    lex_destroy(l);
    return;
}
Esempio n. 2
0
bool
VskBase::parse_line(
    VskString& text,
    VskLineNo *lineno,
    shared_ptr<VskStmtsNode>& stmts,
    VskTokenNodes& nodes)
{
    assert(lineno != NULL);

    // delete blank at the beginning and the ending of line
    katahiromz::trim(text, " \t");

    // do nothing if empty
    if (text.empty()) {
        return true;
    }

    // lexical analyse
    lex_line(text, nodes);
    text = vsk_text_from_nodes(nodes);

    // pick up the line number if necessary
    if ((*lineno == 0) && vsk_isdigit(text[0])) {
        *lineno = VskLineNo(atoi(text.c_str()));
        nodes.erase(nodes.begin());
        text = vsk_text_from_nodes(nodes);
        if (nodes.size()) {
            auto& str = nodes.front()->m_text;
            if (str[0] == ' ') {
                str.erase(str.begin());
            }
        }
        if (text.size()) {
            if (text[0] == ' ') {
                text.erase(text.begin());
            }
        }
    }

    VskTokenNodes new_nodes;
    trim_nodes(new_nodes, nodes);
    new_nodes.emplace_back(make_shared<VskTokenNode>(TK_eof));

    // parse nodes
    if (!parse_nodes(new_nodes, stmts)) {
        // Syntax error
        do_error(2, *lineno);
#ifndef NDEBUG
        auto text = vsk_debug_text_from_nodes(new_nodes);
        std::cout << text << std::endl;
#endif
        return false;
    }

    return true;
} // VskBase::parse_line