Selaa lähdekoodia

Added a way to track scopes

master
Nathan R 3 vuotta sitten
vanhempi
commit
b680c8b3a4
1 muutettua tiedostoa jossa 77 lisäystä ja 55 poistoa
  1. +77
    -55
      ccmeta.leg

+ 77
- 55
ccmeta.leg Näytä tiedosto

@ -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;

Ladataan…
Peruuta
Tallenna