/* * Main program * Reads and stores variables. * Invokes graph operations to build and colour the graph of variables. */ #include #include #include "token.h" #include "symbol.h" #include "graph.h" int main() { struct token t; GRAPH g; int stmt; extern void storeSymbols(GRAPH g); extern void storeAdjacencies(GRAPH g); token_init(stdin); stmt = 0; while (t = get_next_token(), t.type != EOF) { switch (t.type) { case TOKEN_IDENT: symbol_set_seen(t.symvalue, stmt); break; case ';': stmt++; break; /* ignore all else */ } } g = new_graph(symbol_count()); storeSymbols(g); storeAdjacencies(g); colour_graph(g); print_graph(g); return 0; } void storeSymbols(GRAPH g) { SYMBOL_ITER i = new_symbol_iter(); SYMBOL x; for (x = first_symbol(i); x; x = next_symbol(i)) symbol_setindex(x, add_vertex(g, symbol_getname(x))); } void storeAdjacencies(GRAPH g) { SYMBOL_ITER i = new_symbol_iter(); SYMBOL_ITER j = new_symbol_iter(); SYMBOL x, y; for (x = first_symbol(i); x; x = next_symbol(i)) { for (y = first_symbol(j); y; y = next_symbol(j)) { if (x != y && live_range_is_overlapping(x, y)) { add_edge(g, symbol_getindex(x), symbol_getindex(y)); add_edge(g, symbol_getindex(y), symbol_getindex(x)); } } } }