Bläddra i källkod

Added a way to track scopes

master
Nathan R 3 år sedan
förälder
incheckning
b680c8b3a4
1 ändrade filer med 77 tillägg och 55 borttagningar
  1. +77
    -55
      ccmeta.leg

+ 77
- 55
ccmeta.leg Visa fil

@ -52,6 +52,7 @@ DO_PROTOS()
#define SYMBOL_PAYLOAD proto_t prototype; int typeName; #define SYMBOL_PAYLOAD proto_t prototype; int typeName;
#define DELTA 3 #define DELTA 3
#include "scope.c"
#include "object.c" #include "object.c"
#include <setjmp.h> #include <setjmp.h>
@ -260,6 +261,7 @@ oop newNullObject() {
return null; 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 new_C_if(oop ifTok, oop lParen, oop condition, oop rParen, oop consequent, oop elseTok, oop alternate)
{ {
oop obj = newObject(C_if_proto); oop obj = newObject(C_if_proto);
@ -813,13 +815,58 @@ oop new_C_parameter(oop paramSpecifiers, oop declarator) {
return object; 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; int typdeffing = 0;
void declarationTypedef() { void declarationTypedef() {
typdeffing++; typdeffing++;
} }
/* TODO */
void C_declarationBegin(void) { void C_declarationBegin(void) {
typdeffing = 0; typdeffing = 0;
} }
@ -833,9 +880,19 @@ void C_declarationEnd(void) {
typdeffing = 0; 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) { int declarationId(char *s) {
oop object = intern(s); oop object = intern(s);
@ -843,12 +900,15 @@ int declarationId(char *s) {
if (typeName) return 1; if (typeName) return 1;
if (!typdeffing) return 0; if (!typdeffing) return 0;
set(object, Symbol, typeName, 1); set(object, Symbol, typeName, 1);
addId(s);
return 1; return 1;
} }
int isTypedefName(char *s) { int isTypedefName(char *s) {
oop object = intern(s); oop object = intern(s);
if (!isTypedefed(s)) return 0;
return get(object, Symbol, typeName); return get(object, Symbol, typeName);
} }
oop new_C_conditional(oop logicalOrExpression, oop question, oop expression, oop colon, oop conditionalExpression) { 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 # 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) } ( 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) } | 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, condition_symbol));
outputNode(map_get(node, rparen_symbol)); outputNode(map_get(node, rparen_symbol));
outputNode(map_get(node, consequent_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; break;
case t_C_while: case t_C_while:
outputNode(map_get(node, whileTok_symbol)); outputNode(map_get(node, whileTok_symbol));
@ -3704,6 +3718,12 @@ void outputTree(oop node, int depth)
} }
#undef CASE #undef CASE
#undef OUT #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) int main(int argc, char **argv)
@ -3755,11 +3775,13 @@ int main(int argc, char **argv)
/**/ /**/
// TODO
initScope();
inputStackPush(NULL); inputStackPush(NULL);
while (yyparse()) { while (yyparse()) {
//outputNode(yylval); //outputNode(yylval);
outputTree(yylval, 0);
printf("\n");
printTree();
} }
return 0; return 0;

Laddar…
Avbryt
Spara