Mercurial > pasana
diff codenodes.c @ 2:ff5e493bc9cb default tip
2003-01-29
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 13 Oct 2012 21:14:50 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codenodes.c Sat Oct 13 21:14:50 2012 +0200 @@ -0,0 +1,961 @@ +/* Zestaw procedur do zamieniania na tekst roznych rodzajow wezlow. */ + +#include <glib.h> +#include "symbols.h" +#include "node.h" +#include "codetext.h" +#include "codetools.h" +#include "codenodes.h" +#include "pascal.tab.h" + +void printNamespace(CodeText *text, Namespace *nam); + +/* Wyświetla dany symbol (nazwę) lub jego zawartość, jeśli nie ma nazwy. */ +void +printSymbolNode(CodeText *text, SymbolNode * node) +{ + if (node == NULL) + return; + + if (node->parent != NULL) { + switch (node->kind) { + case SYM_TYPE_POINTER: + case SYM_TYPE_STRING: + case SYM_TYPE_ARRAY: + case SYM_TYPE_SET: + case SYM_TYPE_SUBRANGE: + case SYM_TYPE_ENUM: + case SYM_TYPE_RECORD: + case SYM_TYPE_FILE: + codeBeginTag(text, HG_TYPE, node); + break; + case SYM_LABEL: + codeBeginTag(text, HG_LABEL, node); + break; + case SYM_CONST: + codeBeginTag(text, HG_CONST, node); + break; + default: + codeBeginTag(text, HG_IDENT, node); + } + codePrint(text, node->name->str); + codeEndTag(text); + } else { + printSymbolNodeContents(text, node); + } + +} + +/* Wyświetla treść danego symbolu. */ +void +printSymbolNodeContents(CodeText *text, SymbolNode * node) +{ + GList *iter; + + if (node == NULL) + return; + + switch (node->kind) { + case SYM_TAG_FIELD: + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data!=NULL) { + printExprNode(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } + break; + case SYM_TYPE_POINTER: + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "^"); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_TYPE_STRING: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "STRING"); + codeEndTag(text); + if (node->expr != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "["); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "]"); + codeEndTag(text); + } + break; + case SYM_TYPE_ARRAY: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "ARRAY"); + codeEndTag(text); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "["); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + printSymbolNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "] "); + codeEndTag(text); + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "OF "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_TYPE_SET: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "SET OF "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_TYPE_SUBRANGE: + printExprNode(text, node->expr); + break; + case SYM_TYPE_ENUM: + codePrint(text, "enumeraton"); + break; + case SYM_TYPE_RECORD: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "RECORD"); + codeEndTag(text); + codeNewLine(text); + codeIndent(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data!=NULL) { + printSymbolNodeDef(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } + /* printNamespace(text, node->symbols); */ + printSymbolNodeDef(text, node->base); + codeUnindent(text); + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "END"); + codeEndTag(text); + break; + case SYM_TYPE_FILE: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "FILE OF "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_VAR_LOCAL: + case SYM_VAR_PARAM: + case SYM_VAR_VARPARAM: + case SYM_VAR_DEARR: + case SYM_VAR_DEREF: + case SYM_VAR_CAST: + case SYM_UNIT: + printSymbolNode(text, node); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + break; + case SYM_LABEL: + printSymbolNode(text, node); +#if 0 + codeBeginTag(text, HG_LABEL, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + break; + case SYM_CONST: + printSymbolNode(text, node); +#if 0 + codeBeginTag(text, HG_CONST, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + break; + case SYM_VAR_FIELD: + if (node->base == node) { + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); + } else { + printSymbolNode(text, node->base); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "."); + codeEndTag(text); + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); + } + break; + case SYM_PROC: + case SYM_FUNC: + codeIndent(text); + printNamespace(text, node->symbols); + printStmtNode(text, node->stmt); + codeUnindent(text); + break; + case SYM_PROG: + codeIndent(text); + printNamespace(text, node->symbols); + + printStmtNode(text, node->stmt); + codeUnindent(text); + break; + default: + codeBeginTag(text, HG_ERROR, NULL); + codePrint(text, "?symbol?"); + codeEndTag(text); + } +} + +/* Wyświetla definicję danego symbolu. */ +void +printSymbolNodeDef(CodeText *text, SymbolNode * node) +{ + GList *iter; + + if (node == NULL) + return; + + if (node->bcomm != NULL) { + codeBeginTag(text, HG_COMMENT, NULL); + codePrint(text, node->bcomm->str); + codeEndTag(text); + codeNewLine(text); + } + + if (node->ccomm!=NULL) { + codeComment(text, node->ccomm->str); + } + + switch (node->kind) { + case SYM_TAG_FIELD: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "CASE "); + codeEndTag(text); + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); + if (node->type!=NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + } + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, " OF"); + codeEndTag(text); + codeNewLine(text); + codeIndent(text); + printSymbolNodeContents(text, node); + codeUnindent(text); + break; + case SYM_TYPE_POINTER: + case SYM_TYPE_STRING: + case SYM_TYPE_ARRAY: + case SYM_TYPE_SET: + case SYM_TYPE_SUBRANGE: + case SYM_TYPE_ENUM: + case SYM_TYPE_RECORD: + case SYM_TYPE_FILE: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "TYPE "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, " = "); + codeEndTag(text); + printSymbolNodeContents(text, node); + break; + case SYM_VAR_PARAM: +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_VAR_VARPARAM: + codeBeginTag(text, HG_TYPE, NULL); + codePrint(text, "VAR "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + if (node->type!=NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + } + break; + case SYM_VAR_LOCAL: + case SYM_VAR_DEARR: + case SYM_VAR_DEREF: + case SYM_VAR_CAST: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "VAR "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_VAR_FIELD: + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data != NULL) { + printExprNode(text, iter->data); + } + codeBeginTag(text, HG_PUNCT, NULL); + if (iter->next != NULL) { + codePrint(text, ", "); + } else { + codePrint(text, ": "); + } + codeEndTag(text); + } + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + break; + case SYM_LABEL: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "LABEL "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_LABEL, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + break; + case SYM_PROC: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "PROCEDURE "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + if (node->list != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + printSymbolNodeDef(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "; "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ")"); + codeEndTag(text); + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + printSymbolNodeContents(text, node); + break; + case SYM_FUNC: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "FUNCTION "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + if (node->list != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + node = ((SymbolNode *) iter->data); + printSymbolNodeDef(text, node); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "; "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ")"); + codeEndTag(text); + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + printSymbolNodeContents(text, node); + break; + case SYM_CONST: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "CONST "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_CONST, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + if (node->type != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printSymbolNode(text, node->type); + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, " = "); + codeEndTag(text); + printExprNode(text, node->expr); + break; + case SYM_UNIT: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "USES "); + codeEndTag(text); +#if 0 + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); +#endif + printSymbolNode(text, node); + break; + case SYM_PROG: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "PROGRAM "); + codeEndTag(text); + codeBeginTag(text, HG_IDENT, node); + codePrint(text, node->name->str); + codeEndTag(text); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + codePrint(text, (char *)(iter->data)); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ");"); + codeEndTag(text); + codeNewLine(text); + printSymbolNodeContents(text, node); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "."); + codeEndTag(text); + break; + default: + codeBeginTag(text, HG_ERROR, NULL); + codePrint(text, "?symbol?"); + codeEndTag(text); + } +} + +/* Wyświetla węzeł rozkazu. */ +void +printStmtNode(CodeText *text, StmtNode * node) +{ + GList *iter; + + if (node == NULL) + return; + + if (node->bcomm != NULL) { + codeBeginTag(text, HG_COMMENT, NULL); + codePrint(text, node->bcomm->str); + codeEndTag(text); + codeNewLine(text); + } + + if (node->label!=NULL) { + codeLabel(text, node->label->name->str); + codeLabel(text, ": "); + } + + if (node->ccomm!=NULL) { + codeComment(text, node->ccomm->str); + } + + switch (node->kind) { + case STMT_CASE_CASE: + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ": "); + codeEndTag(text); + printStmtNode(text, node->stmt); + break; + case STMT_CASE_HEAD: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "CASE "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " OF"); + codeEndTag(text); + codeNewLine(text); + codeIndent(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data != NULL) { + printStmtNode(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } + if (node->stmt != NULL) { + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "ELSE "); + codeEndTag(text); + printStmtNode(text, node->stmt); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + codeUnindent(text); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "END"); + codeEndTag(text); + break; + case STMT_REPEAT: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "REPEAT"); + codeEndTag(text); + codeNewLine(text); + codeIndent(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + printStmtNode(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + codeUnindent(text); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "UNTIL "); + codeEndTag(text); + printExprNode(text, node->expr); + break; + case STMT_WHILE: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "WHILE "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " DO "); + codeEndTag(text); + printStmtNode(text, node->stmt); + break; + case STMT_WITH: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "WITH "); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data != NULL) { + printSymbolNode(text, (SymbolNode *)iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + } + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " DO "); + codeEndTag(text); + printStmtNode(text, node->stmt); + break; + case STMT_GOTO: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "GOTO "); + codeEndTag(text); + printSymbolNode(text, node->symbol); + break; + case STMT_BLOCK: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "BEGIN"); + codeEndTag(text); + codeNewLine(text); + codeIndent(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data != NULL) { + printStmtNode(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } + codeUnindent(text); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "END"); + codeEndTag(text); + break; + case STMT_IF: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "IF "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " THEN "); + codeEndTag(text); + printStmtNode(text, node->stmt); + if (node->stmt2 != NULL) { + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " ELSE "); + codeEndTag(text); + printStmtNode(text, node->stmt2); + } + break; + case STMT_ASSIGN: + printSymbolNode(text, node->symbol); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ":= "); + codeEndTag(text); + printExprNode(text, node->expr); + break; + case STMT_PROC: + printSymbolNode(text, node->symbol); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ")"); + codeEndTag(text); + break; + case STMT_FOR: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "FOR "); + codeEndTag(text); + printSymbolNode(text, node->symbol); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ":= "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " TO "); + codeEndTag(text); + printExprNode(text, node->expr2); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " DO "); + codeEndTag(text); + printStmtNode(text, node->stmt); + break; + case STMT_FOR_DOWN: + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, "FOR "); + codeEndTag(text); + printSymbolNode(text, node->symbol); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ":= "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " DOWNTO "); + codeEndTag(text); + printExprNode(text, node->expr2); + codeBeginTag(text, HG_KEYWORD, NULL); + codePrint(text, " DO "); + codeEndTag(text); + printStmtNode(text, node->stmt); + break; + default: + codeBeginTag(text, HG_ERROR, NULL); + codePrint(text, "?stmt?"); + codeEndTag(text); + } +} + +const char * +getOper(enum OperKind oper) +{ + switch (oper) { + case OPER_PLUS: + return "+"; + case OPER_MINUS: + return "-"; + case OPER_STAR: + return "*"; + case OPER_SLASH: + return "/"; + case OPER_DIV: + return "DIV"; + case OPER_MOD: + return "MOD"; + case OPER_SHL: + return "SHL"; + case OPER_SHR: + return "SHR"; + case OPER_EQ: + return "="; + case OPER_NEQ: + return "<>"; + case OPER_GT: + return ">"; + case OPER_LT: + return "<"; + case OPER_GEQ: + return ">="; + case OPER_LEQ: + return "<="; + case OPER_IN: + return "IN"; + case OPER_XOR: + return "XOR"; + case OPER_OR: + return "OR"; + case OPER_AND: + return "AND"; + case OPER_NOT: + return "NOT"; + case OPER_NONE: + default: + return " "; + + } +} + +void +printExprNode(CodeText *text, ExprNode * node) +{ + GList *iter; + + if (node == NULL) + return; + + switch (node->kind) { + case EXPR_VARIANT: + printExprNode(text, node->expr); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text,"("); + codeEndTag(text); + codeIndent(text); + codeNewLine(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + if (iter->data!=NULL) { + printSymbolNodeDef(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } + printSymbolNodeDef(text, node->symbol); + codeUnindent(text); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text,")"); + codeEndTag(text); + break; + case EXPR_CASES: + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + codeBeginTag(text, HG_PUNCT, NULL); + if (iter->next != NULL) + codePrint(text, ", "); + else + codePrint(text, ": "); + codeEndTag(text); + } + break; + case EXPR_ADDR: + if (node->symbol != NULL) { + codePrint(text, "@"); + printSymbolNode(text, node->symbol); + } else { + printExprNode(text, node->expr); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ":"); + codeEndTag(text); + printExprNode(text, node->expr2); + } + break; + case EXPR_NUMBER: + codeBeginTag(text, HG_NUMBER, node); + codePrint(text, node->value->str); + codeEndTag(text); + break; + case EXPR_STRING: + codeBeginTag(text, HG_STRING, node); + codePrint(text, node->value->str); + codeEndTag(text); + break; + case EXPR_CONST: + case EXPR_VAR: + printSymbolNode(text, node->symbol); + break; + case EXPR_PAREN: + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "( "); + codeEndTag(text); + printExprNode(text, node->expr); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, " )"); + codeEndTag(text); + break; + case EXPR_UN: + codeBeginTag(text, HG_OPER, node); + codePrint(text, getOper(node->oper)); + codeEndTag(text); + printExprNode(text, node->expr); + break; + case EXPR_BIN: + case EXPR_EQ: + printExprNode(text, node->expr); + codePrint(text, " "); + codeBeginTag(text, HG_OPER, node); + codePrint(text, getOper(node->oper)); + codeEndTag(text); + codePrint(text, " "); + printExprNode(text, node->expr2); + break; + case EXPR_SET: + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "["); + codeEndTag(text); + if (node->list != NULL) { + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "]"); + codeEndTag(text); + break; + case EXPR_ARRAY: + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + if (node->list != NULL) { + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ")"); + codeEndTag(text); + break; + case EXPR_NIL: + codeBeginTag(text, HG_CONST, node); + codePrint(text, "NIL"); + codeEndTag(text); + break; + case EXPR_RANGE: + printExprNode(text, node->expr); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ".."); + codeEndTag(text); + printExprNode(text, node->expr2); + break; + case EXPR_FUNC: + printSymbolNode(text, node->symbol); + if (node->list != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, "("); + codeEndTag(text); + for (iter = node->list; iter != NULL; iter = iter->next) { + printExprNode(text, iter->data); + if (iter->next != NULL) { + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ", "); + codeEndTag(text); + } + } + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ")"); + codeEndTag(text); + } + default: + codeBeginTag(text, HG_ERROR, NULL); + codePrint(text, "?expr?"); + codeEndTag(text); + } +} + +void +printNamespace(CodeText *text, Namespace * nam) +{ + GList *iter; + SymbolNode *node; + + if (nam == NULL) + return; + for (iter = nam->list; iter != NULL; iter = iter->next) { + node = ((SymbolNode *) iter->data); + if ((node->kind != SYM_VAR_PARAM) && (node->kind != SYM_VAR_VARPARAM)) { + printSymbolNodeDef(text, node); + codeBeginTag(text, HG_PUNCT, NULL); + codePrint(text, ";"); + codeEndTag(text); + codeNewLine(text); + } + } +}
