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; }
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