diff --git a/ccmeta.leg b/ccmeta.leg index 14229f3..0f1b041 100644 --- a/ccmeta.leg +++ b/ccmeta.leg @@ -1241,12 +1241,14 @@ oop newTry(oop try, oop exception, oop catch, oop finally) return obj; } -enum language { +int toPrint = 0; + +typedef enum { META = 0, C = 1, -}; +} language; -enum language lang = C; +language lang = C, printLang = C; %} @@ -3385,6 +3387,7 @@ oop AST= NULL; oop outputProgram= 0; void outputNode(oop node); +void printTree(oop element, language id); void readEvalPrint(oop scope, char *fileName) { @@ -3419,15 +3422,19 @@ void readEvalPrint(oop scope, char *fileName) proto_t proto_number = get(map_get(proto, __name___symbol), Symbol, prototype); if (proto_number > META_PROTO_MAX) { if (opt_v > 1) println(yylval); - outputNode(yylval); - //map_append(outputProgram, yylval); + map_append(outputProgram, yylval); continue; } - if (opt_v > 1) printf("%s:%i: ", get(inputStack->name, String, value), inputStack->lineNumber); - if (opt_v > 1) println(yylval); - oop res = eval(scope, yylval); - if (opt_v > 0) println(res); - assert(jbs == jtop); + if (toPrint) { + printLang = META; + printTree(yylval, printLang); + } else { + if (opt_v > 1) printf("%s:%i: ", get(inputStack->name, String, value), inputStack->lineNumber); + if (opt_v > 1) println(yylval); + oop res = eval(scope, yylval); + if (opt_v > 0) println(res); + assert(jbs == jtop); + } } assert(inputStack); inputStackPop(); @@ -3848,6 +3855,12 @@ void outputValue(oop node) { case Symbol: printf("<%s>\n", get(node, Symbol, name)); return; + case Integer: + printf("<%lli>\n", getInteger(node)); + return; + case Float: + printf("<%Lf>\n", getFloat(node)); + return; default: fprintf(stderr, "\noutputNode: unknown node type %i\n", getType(node)); abort(); @@ -3892,7 +3905,7 @@ void outputTree(oop node, int depth) #undef CASE #undef OUT - /** C nodes */ + /** C terminal nodes */ #define CASE(NAME) case t_C_##NAME:printf("%s:\n", #NAME); #define OUT(NAME) printSpace(depth+DELTA) ; outputValue(map_get(node, NAME##_symbol)); @@ -3912,8 +3925,27 @@ void outputTree(oop node, int depth) OUT(identifier); break; #undef CASE + + /** Meta terminal nodes */ + +#define CASE(NAME) case t_##NAME:printf("%s:\n", #NAME); + CASE(Symbol) + OUT(value); + break; + CASE(Integer) + OUT(value); + break; + CASE(Float) + OUT(value); + break; + CASE(String) + OUT(value); + break; +#undef CASE #undef OUT + /** C nodes */ + #define CASE(NAME) case t_C_##NAME:printf("%s:\n", #NAME); #define OUT(NAME) printSpace(depth+DELTA); printf("(%s)\n", #NAME); outputTree(map_get(node, NAME##_symbol), depth+2*DELTA); CASE(if) @@ -4198,23 +4230,230 @@ void outputTree(oop node, int depth) OUT(attributeL); OUT(expression); break; +#undef CASE /** Meta nodes */ +#define CASE(NAME) case t_##NAME:printf("%s:\n", #NAME); + CASE(Map) + OUT(value); + break; + CASE(Declaration) + OUT(lhs); + OUT(rhs); + break; + CASE(If) + OUT(condition); + OUT(consequent); + OUT(alternate); + break; + CASE(While) + OUT(condition); + OUT(body); + break; + CASE(Do) + OUT(body); + OUT(condition); + break; + CASE(For) + OUT(initialise); + OUT(condition); + OUT(update); + OUT(body); + break; + CASE(ForIn) + OUT(name); + OUT(expression); + OUT(body); + break; + CASE(Switch) + OUT(expression); + OUT(labels); + OUT(statements); + break; + CASE(Func) + OUT(name); + OUT(param); + OUT(body); + OUT(fixed); + break; + CASE(Call) + OUT(func); + OUT(args); + break; + CASE(Invoke) + OUT(this); + OUT(name); + OUT(args); + break; + CASE(Block) + OUT(statements); + break; + CASE(Break) + break; + CASE(Try) + OUT(try); + OUT(exception); + OUT(catch); + OUT(finally); + break; + CASE(Return) + OUT(value); + break; + CASE(Logor) + OUT(lhs); + OUT(rhs); + break; + CASE(Logand) + OUT(lhs); + OUT(rhs); + break; + CASE(Continue) + break; + CASE(Bitand) + OUT(lhs); + OUT(rhs); + break; + CASE(Bitor) + OUT(lhs); + OUT(rhs); + break; + CASE(Bitxor) + OUT(lhs); + OUT(rhs); + break; + CASE(Equal) + OUT(lhs); + OUT(rhs); + break; + CASE(Noteq) + OUT(lhs); + OUT(rhs); + break; + CASE(Less) + OUT(lhs); + OUT(rhs); + break; + CASE(Lesseq) + OUT(lhs); + OUT(rhs); + break; + CASE(Greatereq) + OUT(lhs); + OUT(rhs); + break; + CASE(Greater) + OUT(lhs); + OUT(rhs); + break; + CASE(Shleft) + OUT(lhs); + OUT(rhs); + break; + CASE(Shright) + OUT(lhs); + OUT(rhs); + break; + CASE(Add) + OUT(lhs); + OUT(rhs); + break; + CASE(Sub) + OUT(lhs); + OUT(rhs); + break; + CASE(Mul) + OUT(lhs); + OUT(rhs); + break; + CASE(Div) + OUT(lhs); + OUT(rhs); + break; + CASE(Mod) + OUT(lhs); + OUT(rhs); + break; + CASE(Throw) + OUT(rhs); + break; + CASE(Neg) + OUT(rhs); + break; + CASE(Com) + OUT(rhs); + break; + CASE(Not) + OUT(rhs); + break; + CASE(PreIncVariable) + OUT(rhs); + break; + CASE(PreIncMember) + OUT(rhs); + break; + CASE(PreIncIndex) + OUT(rhs); + break; + CASE(PostIncVariable) + OUT(rhs); + break; + CASE(PostIncMember) + OUT(rhs); + break; + CASE(PostIncIndex) + OUT(rhs); + break; + CASE(PreDecVariable) + OUT(rhs); + break; + CASE(PreDecMember) + OUT(rhs); + break; + CASE(PreDecIndex) + OUT(rhs); + break; + CASE(PostDecVariable) + OUT(rhs); + break; + CASE(PostDecMember) + OUT(rhs); + break; + CASE(PostDecIndex) + OUT(rhs); + break; + + +/** TODO +* CASE(Quasiquote) +* PRINT(Quasiquote); +* OUT(rhs); +* break; +* CASE(Unquote) +* PRINT(Unquote); +* OUT(rhs); +* break; +*/ + /** Unknown node */ default: printf("I cannot print a node with proto_number %i\n", proto_number); exit(0); } +#undef PRINT #undef CASE #undef OUT } -void printTree(oop element) { - outputTree(element, 0); + +void printTree(oop element, language id) { + if (id == C) printf("-- C program --\n"); + else if (id == META) printf("-- Meta program --\n"); + else fprintf(stderr, "Wrong language in printTree()"); + outputTree(element, 3); printf("\n"); } -int toPrint = 0; + int main(int argc, char **argv) { @@ -4296,10 +4535,11 @@ int main(int argc, char **argv) readEvalPrint(globals, NULL); } + printLang = C; for (size_t i= 0; i < map_size(outputProgram); ++i) { oop element= get(outputProgram, Map, elements)[i].value; - if (toPrint) printTree(element); - //else outputNode(element); + if (toPrint) printTree(element, printLang); + else outputNode(element); } if (opt_g) {