|
|
@ -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) { |
|
|
|