|
|
@ -52,6 +52,7 @@ DO_PROTOS() |
|
|
|
#define SYMBOL_PAYLOAD proto_t prototype; int typeName; |
|
|
|
#define DELTA 3 |
|
|
|
|
|
|
|
#include "scope.c" |
|
|
|
#include "object.c" |
|
|
|
|
|
|
|
#include <setjmp.h> |
|
|
@ -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; |
|
|
|