Преглед на файлове

First Version of printing the AST

master
Nathan R преди 4 години
родител
ревизия
8fa5b40b4d
променени са 1 файла, в които са добавени 382 реда и са изтрити 2 реда
  1. +382
    -2
      ccmeta.leg

+ 382
- 2
ccmeta.leg Целия файл

@ -3059,7 +3059,6 @@ void outputNode(oop node)
outputNode(map_get(node, name_symbol));
outputNode(map_get(node, semicolon_symbol));
break;
case t_C_initializer:
outputNode(map_get(node, leftCurly_symbol));
outputNode(map_get(node, initList_symbol));
@ -3312,6 +3311,386 @@ void outputNode(oop node)
}
void outputValue(oop node) {
if (!node) return;
switch (getType(node)) {
case Undefined:
return;
case String:
printf("%s\n", (get(node, String, value)));
return;
case Map:
break;
case Symbol:
printf("%s\n", get(node, Symbol, name));
return;
default:
fprintf(stderr, "\noutputNode: unknown node type %i\n", getType(node));
abort();
}
}
void printSpace(int depth) {
for (int i = 0 ; i < depth ; i++) {
printf(" ");
}
}
void outputTree(oop node, int depth)
{
assert(is(Map, node));
oop proto= map_get(node, __proto___symbol);
if (null == proto) { // assume this is just a list of nodes
size_t size= map_size(node);
for (size_t i= 0; i < size; ++i) {
if (!map_hasIntegerKey(node, i)) break;
outputTree(get(node, Map, elements)[i].value, depth);
}
return;
}
// proto_number is the enum version of the proto symbol
proto_t proto_number= get(map_get(proto, __name___symbol), Symbol, prototype);
printSpace(depth);
switch (proto_number) {
case t_Comment:
break;
case t_Token:
printf("TOKEN : ");
outputValue(map_get(node, text_symbol));
break;
case t_C_int:
printf("INT : ");
outputValue(map_get(node, text_symbol));
break;
case t_C_float:
printf("FLOAT : ");
outputValue(map_get(node, text_symbol));
break;
case t_C_char:
printf("CHAR : ");
outputValue(map_get(node, value_symbol));
break;
case t_C_id:
printf("ID : ");
outputValue(map_get(node, identifier_symbol));
break;
case t_C_if:
outputTree(map_get(node, if_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, condition_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, consequent_symbol), depth+3);
outputTree(map_get(node, else_symbol), depth); // null if no else clause
outputTree(map_get(node, alternate_symbol), depth+3); // null if no else clause
break;
case t_C_while:
outputTree(map_get(node, while_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_do:
outputTree(map_get(node, do_symbol), depth);
outputTree(map_get(node, statements_symbol), depth+3);
outputTree(map_get(node, while_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_for:
outputTree(map_get(node, for_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, initExpr_symbol), depth+3);
outputTree(map_get(node, firstSemi_symbol), depth+3);
outputTree(map_get(node, condExpr_symbol), depth+3);
outputTree(map_get(node, secondSemi_symbol), depth+3);
outputTree(map_get(node, incrExpr_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_goto:
outputTree(map_get(node, gotoTok_symbol), depth);
outputTree(map_get(node, star_symbol), depth+3);
outputTree(map_get(node, name_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_initializer:
printf("INITIALIZER :\n");
outputTree(map_get(node, leftCurly_symbol), depth+3);
outputTree(map_get(node, initList_symbol), depth+3);
outputTree(map_get(node, comma_symbol), depth+3);
outputTree(map_get(node, rightCurly_symbol), depth+3);
break;
case t_C_range:
printf("RANGE :\n");
outputTree(map_get(node, constExpr1_symbol), depth+3);
outputTree(map_get(node, ellipsis_symbol), depth+3);
outputTree(map_get(node, constExpr2_symbol), depth+3);
break;
case t_C_switch:
outputTree(map_get(node, switchTok_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_case:
outputTree(map_get(node, caseTok_symbol), depth);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, colon_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_default:
outputTree(map_get(node, defaultTok_symbol), depth);
outputTree(map_get(node, colon_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_attribution:
printf("ATTRIBUTION :\n");
outputTree(map_get(node, specifiers_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
break;
case t_C_deref:
printf("DEREF :\n");
outputTree(map_get(node, star_symbol), depth+3);
outputTree(map_get(node, typeQualList_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
break;
case t_C_functionDef:
printf("FUNCTION DEF :\n");
outputTree(map_get(node, specifiers_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, declarationL_symbol), depth+3);
outputTree(map_get(node, compoundS_symbol), depth+3);
break;
case t_C_sizeOf:
outputTree(map_get(node, sizeOfTok_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, typeName_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_alignOf:
outputTree(map_get(node, alignOfTok_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, typeName_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_prefix:
printf("PREFIX :\n");
outputTree(map_get(node, operator_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
break;
case t_C_postfix:
printf("POSTFIX :\n");
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, operator_symbol), depth+3);
break;
case t_C_unary:
printf("UNARY :\n");
outputTree(map_get(node, operator_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
break;
case t_C_binary:
printf("BINARY \n");
outputTree(map_get(node, lhs_symbol), depth+3);
outputTree(map_get(node, binary_symbol), depth+3);
outputTree(map_get(node, rhs_symbol), depth+3);
break;
case t_C_compound:
printf("COMPOUND :\n");
outputTree(map_get(node, leftCurly_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rightCurly_symbol), depth+3);
break;
case t_C_subexpr:
printf("SUBEXPR :\n");
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_call:
printf("CALL :\n");
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, paramTypeL_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_array:
printf("ARRAY :\n");
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, leftBracket_symbol), depth+3);
outputTree(map_get(node, static_symbol), depth+3);
outputTree(map_get(node, typeQualList_symbol), depth+3);
outputTree(map_get(node, dynamic_symbol), depth+3);
outputTree(map_get(node, assignExpr_symbol), depth+3);
outputTree(map_get(node, rightBracket_symbol), depth+3);
break;
case t_C_block:
printf("BLOCK :\n");
outputTree(map_get(node, bxor_symbol), depth+3);
outputTree(map_get(node, typeQualList_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
break;
case t_C_continue:
outputTree(map_get(node, continueTok_symbol), depth);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_break:
outputTree(map_get(node, breakTok_symbol), depth);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_return:
outputTree(map_get(node, returnTok_symbol), depth);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_exprStatement:
printf("EXPRESSION :");
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_asm:
outputTree(map_get(node, asmTok_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, text_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_asmExpr:
printf("ASM EXPR :");
outputTree(map_get(node, asmTok_symbol), depth+3);
outputTree(map_get(node, volatileTok_symbol), depth+3);
outputTree(map_get(node, gotoTok_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, text_symbol), depth+3);
outputTree(map_get(node, element_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
break;
case t_C_asmExprArg:
printf("ASM EXPR ARG :\n");
outputTree(map_get(node, text_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
break;
case t_C_declaration:
printf("DECLARATION :\n");
outputTree(map_get(node, specifiers_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_parameter:
printf("PARAMETER :\n");
outputTree(map_get(node, specifiers_symbol), depth+3);
outputTree(map_get(node, declarators_symbol), depth+3);
break;
case t_C_conditional:
printf("CONDITIONAL :\n");
outputTree(map_get(node, logicalOr_symbol), depth+3);
outputTree(map_get(node, question_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, colon_symbol), depth+3);
outputTree(map_get(node, condExpr_symbol), depth+3);
break;
case t_C_designation:
printf("DESIGNATION :\n");
outputTree(map_get(node, identifier_symbol), depth+3);
outputTree(map_get(node, colon_symbol), depth+3);
break;
case t_C_index:
printf("INDEX :\n");
outputTree(map_get(node, primaryExpr_symbol), depth+3);
outputTree(map_get(node, leftBracket_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rightBracket_symbol), depth+3);
break;
case t_C_typeOf:
outputTree(map_get(node, typeOfTok_symbol), depth);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, typeName_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_cast:
printf("CAST :\n");
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, typeName_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
break;
case t_C_attributeSpec:
printf("ATTRIBUTE SPEC :\n");
outputTree(map_get(node, attributeTok_symbol), depth+3);
outputTree(map_get(node, llparen_symbol), depth+3);
outputTree(map_get(node, lrparen_symbol), depth+3);
outputTree(map_get(node, attributeL_symbol), depth+3);
outputTree(map_get(node, rlparen_symbol), depth+3);
outputTree(map_get(node, rrparen_symbol), depth+3);
break;
case t_C_aggregate:
printf("AGGREGATE :\n");
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, typeName_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
outputTree(map_get(node, leftCurly_symbol), depth+3);
outputTree(map_get(node, initList_symbol), depth+3);
outputTree(map_get(node, comma_symbol), depth+3);
outputTree(map_get(node, rightCurly_symbol), depth+3);
break;
case t_C_attribute:
printf("ATTRIBUTE :\n");
outputTree(map_get(node, text_symbol), depth+3);
outputTree(map_get(node, lparen_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
outputTree(map_get(node, rparen_symbol), depth+3);
break;
case t_C_label:
printf("LABEL :\n");
outputTree(map_get(node, name_symbol), depth+3);
outputTree(map_get(node, colon_symbol), depth+3);
outputTree(map_get(node, attributeL_symbol), depth+3);
outputTree(map_get(node, statements_symbol), depth+3);
break;
case t_C_labelDeclaration:
outputTree(map_get(node, labels_symbol), depth);
outputTree(map_get(node, element_symbol), depth+3);
outputTree(map_get(node, semicolon_symbol), depth+3);
break;
case t_C_structSpec:
outputTree(map_get(node, structTok_symbol), depth);
outputTree(map_get(node, attribute1_symbol), depth+3);
outputTree(map_get(node, name_symbol), depth+3);
outputTree(map_get(node, leftCurly_symbol), depth+3);
outputTree(map_get(node, declarationL_symbol), depth+3);
outputTree(map_get(node, rightCurly_symbol), depth+3);
outputTree(map_get(node, attribute2_symbol), depth+3);
break;
case t_C_structDeclarator:
printf("STRUCT DECLARATOR :\n");
outputTree(map_get(node, declarators_symbol), depth+3);
outputTree(map_get(node, colon_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
break;
case t_C_enumSpec:
outputTree(map_get(node, enumTok_symbol), depth);
outputTree(map_get(node, name_symbol), depth+3);
outputTree(map_get(node, leftCurly_symbol), depth+3);
outputTree(map_get(node, enumList_symbol), depth+3);
outputTree(map_get(node, rightCurly_symbol), depth+3);
break;
case t_C_enum:
printf("ENUM :");
outputTree(map_get(node, name_symbol), depth+3);
outputTree(map_get(node, attributeL_symbol), depth+3);
outputTree(map_get(node, expression_symbol), depth+3);
break;
default:
printf("I cannot print a node with proto_number %i\n", proto_number);
exit(0);
}
}
int main(int argc, char **argv)
{
# if (USE_GC)
@ -3363,7 +3742,8 @@ int main(int argc, char **argv)
inputStackPush(NULL);
while (yyparse()) {
outputNode(yylval);
//outputNode(yylval);
outputTree(yylval, 0);
}
return 0;

Зареждане…
Отказ
Запис