Sfoglia il codice sorgente

added a way to print meta nodes, some nodes are missing but most of it is there

master
Nathan R 3 anni fa
parent
commit
ad1111a9b6
1 ha cambiato i file con 256 aggiunte e 16 eliminazioni
  1. +256
    -16
      ccmeta.leg

+ 256
- 16
ccmeta.leg Vedi File

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

Caricamento…
Annulla
Salva