From b680c8b3a4f0e5dfb25d8544f867e9da38303543 Mon Sep 17 00:00:00 2001 From: Nathan R Date: Fri, 30 Jul 2021 16:22:53 +0200 Subject: [PATCH] Added a way to track scopes --- ccmeta.leg | 132 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 55 deletions(-) diff --git a/ccmeta.leg b/ccmeta.leg index e23d0ed..7628df5 100644 --- a/ccmeta.leg +++ b/ccmeta.leg @@ -52,6 +52,7 @@ DO_PROTOS() #define SYMBOL_PAYLOAD proto_t prototype; int typeName; #define DELTA 3 +#include "scope.c" #include "object.c" #include @@ -260,6 +261,7 @@ oop newNullObject() { return null; } + /** C constructors used when a program is parsed to build an AST */ oop new_C_if(oop ifTok, oop lParen, oop condition, oop rParen, oop consequent, oop elseTok, oop alternate) { oop obj = newObject(C_if_proto); @@ -813,13 +815,58 @@ oop new_C_parameter(oop paramSpecifiers, oop declarator) { return object; } + /* TODO */ + +OopStack listOfLists= BUFFER_INITIALISER; +oop currentList= 0; + +void listBegin(void) +{ + OopStack_push(&listOfLists, currentList); + currentList= makeMap(); +} + +void listAppend(oop obj) +{ + assert(currentList); + map_append(currentList, obj); +} + +void listAppend2(oop obj1, oop obj2) { + assert(currentList); + map_append(currentList, obj1); + map_append(currentList, obj2); +} + +void listWith(oop obj) { + listBegin(); + listAppend(obj); +} + +oop listEnd(void) +{ + assert(currentList); + oop list= currentList; + currentList= OopStack_pop(&listOfLists); + return list; +} + +void List_addLast(oop list, oop obj) { + assert(list); + map_append(list, obj); +} + +oop listEmpty(void) +{ + return makeMap(); +} + int typdeffing = 0; void declarationTypedef() { typdeffing++; } - /* TODO */ void C_declarationBegin(void) { typdeffing = 0; } @@ -833,9 +880,19 @@ void C_declarationEnd(void) { typdeffing = 0; } -void C_scopeBegin(){} -int C_scopeAbort(){ return 0; } -void C_scopeEnd(){} +void C_scopeBegin() { + pushScope(); +} + +int C_scopeAbort() { + popScope(); + return 0; +} + +void C_scopeEnd() { + popScope(); +} + int declarationId(char *s) { oop object = intern(s); @@ -843,12 +900,15 @@ int declarationId(char *s) { if (typeName) return 1; if (!typdeffing) return 0; set(object, Symbol, typeName, 1); + addId(s); return 1; } int isTypedefName(char *s) { oop object = intern(s); + if (!isTypedefed(s)) return 0; return get(object, Symbol, typeName); + } oop new_C_conditional(oop logicalOrExpression, oop question, oop expression, oop colon, oop conditionalExpression) { @@ -1043,52 +1103,6 @@ void setComment(oop ast, oop comment) } -OopStack listOfLists= BUFFER_INITIALISER; -oop currentList= 0; - -void listBegin(void) -{ - OopStack_push(&listOfLists, currentList); - currentList= makeMap(); -} - -void listAppend(oop obj) -{ - assert(currentList); - map_append(currentList, obj); -} - -void listAppend2(oop obj1, oop obj2) { - assert(currentList); - map_append(currentList, obj1); - map_append(currentList, obj2); -} - -void listWith(oop obj) { - listBegin(); - listAppend(obj); -} - -oop listEnd(void) -{ - assert(currentList); - oop list= currentList; - currentList= OopStack_pop(&listOfLists); - return list; -} - -void List_addLast(oop list, oop obj) { - assert(list); - map_append(list, obj); -} - -oop listEmpty(void) -{ - return makeMap(); -} - - - %} @@ -1660,7 +1674,7 @@ expressionStatement = SEMI # 6.8.4 -selectionStatement = i:IF l:LPAREN x:expression r:RPAREN s:statement +selectionStatement = i:IF l:LPAREN x:expression r:RPAREN s:statement ( e:ELSE t:statement | {e=t=newNullObject()} ) { $$= new_C_if(i, l, x, r, s, e, t) } | s:SWITCH l:LPAREN x:expression r:RPAREN t:statement { $$= new_C_switch(s, l, x, r, t) } @@ -3052,8 +3066,8 @@ void outputNode(oop node) outputNode(map_get(node, condition_symbol)); outputNode(map_get(node, rparen_symbol)); outputNode(map_get(node, consequent_symbol)); - outputNode(map_get(node, elseTok_symbol)); // null if no else clause - outputNode(map_get(node, alternate_symbol)); // null if no else clause + outputNode(map_get(node, elseTok_symbol)); // null if no else clause + outputNode(map_get(node, alternate_symbol)); // null if no else clause break; case t_C_while: outputNode(map_get(node, whileTok_symbol)); @@ -3704,6 +3718,12 @@ void outputTree(oop node, int depth) } #undef CASE #undef OUT + //outputTree(map_get(node, comment_symbol), depth); // if we want to print comments +} + +void printTree() { + outputTree(yylval, 0); + printf("\n"); } int main(int argc, char **argv) @@ -3755,11 +3775,13 @@ int main(int argc, char **argv) /**/ + // TODO + initScope(); + inputStackPush(NULL); while (yyparse()) { //outputNode(yylval); - outputTree(yylval, 0); - printf("\n"); + printTree(); } return 0;