Skip to content

Commit e5a3a7e

Browse files
author
Mike Fairhurst
committed
Merge branch 'optional-array-deambiguation'
2 parents 00b2e51 + 08ad824 commit e5a3a7e

22 files changed

+492
-238
lines changed

include/TableFileReader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class TableFileReader {
4040
Type* readClassType(istream& s);
4141
Type* readLambdaType(istream& s);
4242
Type* readParameterizedType(istream& s);
43+
Type* readListType(istream& s);
44+
Type* readOptionalType(istream& s);
4345

4446
};
4547

include/type.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#define TYPE_MATCHALL 4
2222
#define TYPE_NOTHING 5
2323
#define TYPE_UNUSABLE 6
24+
#define TYPE_LIST 7
25+
#define TYPE_OPTIONAL 8
2426

2527
struct TypeArray;
2628

@@ -43,11 +45,17 @@ typedef struct Type {
4345
struct Type* upperbound; // Container{T from List}
4446
struct Type* lowerbound; // Container{T to List}
4547
} parameterized;
48+
struct {
49+
struct Type* contained;
50+
int levels; // number of []
51+
} list;
52+
struct {
53+
struct Type* contained;
54+
int levels; // number of ??
55+
} optional;
4656
} typedata;
47-
int arrayed; // number of []
4857
char* alias; // this should be moved....
4958
char* specialty; // {Alive}
50-
int optional;
5159
} Type;
5260

5361
typedef struct TypeArray {

makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
SHELL=/bin/bash
1616

17-
OPT=-O3
18-
#OPT=-O0 -g
17+
#OPT=-O3
18+
OPT=-O0 -g
1919
FLAGS=-Iinclude -Igen
2020
CC=cc $(FLAGS)
2121
CPP=g++ $(FLAGS)

src/bison/wakeparser.y

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "tree.h"
2121
#include "type.h"
2222

23+
#define YYERROR_VERBOSE
24+
2325
int line = 1;
2426
int column = 1;
2527
extern char* waketext;
@@ -470,8 +472,10 @@ specializabletype:
470472

471473
shadowabletype:
472474
puretype { $$ = $1; }
473-
| SYM_SHADOW classtype { $$ = $2; $$->typedata._class.shadow = $1; }
474-
;
475+
| SYM_SHADOW classtype { $$ = $2;
476+
if($$->type == TYPE_CLASS) $$->typedata._class.shadow = $1;
477+
else if($$->type == TYPE_LIST) $$->typedata.list.contained->typedata._class.shadow = $1;
478+
else if($$->type == TYPE_OPTIONAL) $$->typedata.optional.contained->typedata._class.shadow = $1; }
475479

476480
puretype:
477481
classtype { $$ = $1; }
@@ -490,8 +494,8 @@ types:
490494

491495
classtype:
492496
parameterizedtype { $$ = $1; }
493-
| parameterizedtype '?' { $$ = $1; $$->optional = 1; }
494-
| parameterizedtype SYM_ARRAYED { $$ = $1; $$->arrayed += $2; }
497+
| parameterizedtype '?' { $$ = MakeType(TYPE_OPTIONAL); $$->typedata.optional.levels = 1; $$->typedata.optional.contained = $1; }
498+
| parameterizedtype SYM_ARRAYED { $$ = MakeType(TYPE_LIST); $$->typedata.list.levels = $2; $$->typedata.list.contained = $1; }
495499
;
496500

497501
parameterizedtype:
@@ -504,8 +508,8 @@ fntype:
504508
| puretype SYM_RETURN_DECREMENT FN '(' ')' { $$ = MakeType(TYPE_LAMBDA); $$->typedata.lambda.returntype = $1; }
505509
| FN '(' puretypes ')' { $$ = MakeType(TYPE_LAMBDA); $$->typedata.lambda.arguments = $3; }
506510
| FN '(' ')' { $$ = MakeType(TYPE_LAMBDA); }
507-
| fntype '?' { $$ = $1; $$->optional = 1; }
508-
| fntype SYM_ARRAYED { $$ = $1; $$->arrayed += $2; }
511+
| fntype '?' { $$ = MakeType(TYPE_OPTIONAL); $$->typedata.optional.levels = 1; $$->typedata.optional.contained = $1; }
512+
| fntype SYM_ARRAYED { $$ = MakeType(TYPE_LIST); $$->typedata.list.levels = $2; $$->typedata.list.contained = $1; }
509513
;
510514

511515
unboundtypespecifications:

src/c/tree.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ void printSubNodes(Node *n, int level, char* name) {
181181
}
182182

183183
void printtype(Type* thetype, int level) {
184+
/*
184185
switch(thetype->type) {
185186
case TYPE_LAMBDA:
186187
printf("%*c lambda, []^%d, {%s}, @%s\n", level, ' ', thetype->arrayed, thetype->specialty, thetype->alias);
@@ -199,7 +200,7 @@ void printtype(Type* thetype, int level) {
199200
case TYPE_CLASS:
200201
printf("%*c class %s, $^%d, []^%d, {%s}, @%s\n", level, ' ', thetype->typedata._class.classname, thetype->typedata._class.shadow, thetype->arrayed, thetype->specialty, thetype->alias);
201202
break;
202-
}
203+
}*/
203204
}
204205

205206
void printtree (Node *n, int level) {

src/c/type.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
Type* MakeType(int type) {
2020
Type* thetype = malloc(sizeof(Type));
2121
thetype->type = type;
22-
thetype->arrayed = 0;
2322
thetype->specialty = NULL;
2423
thetype->alias = NULL;
25-
thetype->optional = 0;
2624
switch(type) {
2725
case TYPE_CLASS:
2826
thetype->typedata._class.shadow = 0;
@@ -37,6 +35,14 @@ Type* MakeType(int type) {
3735
thetype->typedata.parameterized.upperbound = NULL;
3836
thetype->typedata.parameterized.lowerbound = NULL;
3937
break;
38+
case TYPE_LIST:
39+
thetype->typedata.list.levels = 0;
40+
thetype->typedata.list.contained = NULL;
41+
break;
42+
case TYPE_OPTIONAL:
43+
thetype->typedata.optional.levels = 0;
44+
thetype->typedata.optional.contained = NULL;
45+
break;
4046
}
4147
return thetype;
4248
}
@@ -74,6 +80,14 @@ void freeType(Type *t) {
7480
if(t->typedata.parameterized.upperbound != NULL) free(t->typedata.parameterized.upperbound);
7581
if(t->typedata.parameterized.lowerbound != NULL) free(t->typedata.parameterized.lowerbound);
7682
break;
83+
84+
case TYPE_LIST:
85+
if(t->typedata.list.contained != NULL) free(t->typedata.list.contained);
86+
break;
87+
88+
case TYPE_OPTIONAL:
89+
if(t->typedata.optional.contained != NULL) free(t->typedata.optional.contained);
90+
break;
7791
}
7892

7993
if(t->alias) free(t->alias);
@@ -95,7 +109,6 @@ Type* copyType(Type* t) {
95109

96110
Type* copy = malloc(sizeof(Type));
97111
copy->type = t->type;
98-
copy->optional = t->optional;
99112
if(t->type == TYPE_LAMBDA) {
100113
copy->typedata.lambda.arguments = copyTypeArray(t->typedata.lambda.arguments);
101114
copy->typedata.lambda.returntype = copyType(t->typedata.lambda.returntype);
@@ -109,8 +122,13 @@ Type* copyType(Type* t) {
109122
copy->typedata.parameterized.shadow = t->typedata.parameterized.shadow; // number of $s
110123
copy->typedata.parameterized.lowerbound = copyType(t->typedata.parameterized.lowerbound);
111124
copy->typedata.parameterized.upperbound = copyType(t->typedata.parameterized.upperbound);
125+
} else if(t->type == TYPE_LIST) {
126+
copy->typedata.list.contained = copyType(t->typedata.list.contained);
127+
copy->typedata.list.levels = t->typedata.list.levels;
128+
} else if(t->type == TYPE_OPTIONAL) {
129+
copy->typedata.optional.contained = copyType(t->typedata.optional.contained);
130+
copy->typedata.optional.levels = t->typedata.optional.levels;
112131
}
113-
copy->arrayed = t->arrayed;
114132
copy->alias = t->alias == NULL ? NULL : strdup(t->alias);
115133
copy->specialty = t->specialty == NULL ? NULL : strdup(t->specialty);
116134
return copy;

src/cpp/ClassParseTreeTraverser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ void ClassParseTreeTraverser::typeCheckMethods(Node* tree) {
307307
classestable->getAnalyzer()->assertClassCanProvide(classname, actual);
308308
}
309309
} else {
310-
errors->addError(new SemanticError(MISMATCHED_INJECTION, "Too many or too few injectioned depndencies", tree));
310+
errors->addError(new SemanticError(MISMATCHED_INJECTION, "Too many or too few injected dependencies", tree));
311311
}
312312
} catch(SemanticError* e) {
313313
e->token = tree;

src/cpp/ClassSpaceSymbolTable.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,14 +189,18 @@ void ClassSpaceSymbolTable::assertTypeIsValid(Type* type) {
189189
}
190190

191191
throw new SemanticError(CLASSNAME_NOT_FOUND, type->typedata._class.classname + string(" is not a valid type"));
192-
} else {
192+
} else if(type->type == TYPE_LAMBDA) {
193193
if(type->typedata.lambda.returntype != NULL)
194194
assertTypeIsValid(type->typedata.lambda.returntype);
195195
if(type->typedata.lambda.arguments == NULL) return;
196196

197197
int i;
198198
for(i = 0; i < type->typedata.lambda.arguments->typecount; i++)
199199
assertTypeIsValid(type->typedata.lambda.arguments->types[i]);
200+
} else if(type->type == TYPE_LIST) {
201+
assertTypeIsValid(type->typedata.list.contained);
202+
} else if(type->type == TYPE_OPTIONAL) {
203+
assertTypeIsValid(type->typedata.optional.contained);
200204
}
201205
}
202206

src/cpp/EntryPointAnalyzer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
bool EntryPointAnalyzer::checkClassNeedsCanBeMain(vector<Type*>* needs) {
2121
for(vector<Type*>::iterator it = needs->begin(); it != needs->end(); ++it) {
2222
if((*it)->type == TYPE_LAMBDA) return false;
23-
if((*it)->arrayed) return false;
23+
if((*it)->type == TYPE_OPTIONAL) return false;
24+
if((*it)->type == TYPE_LIST) return false;
2425
if((*it)->typedata._class.classname == string("Int")) return false;
2526
if((*it)->typedata._class.classname == string("Text")) return false;
2627
if((*it)->typedata._class.classname == string("Truth")) return false;

src/cpp/ObjectFileGenerator.cpp

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,10 @@ void ObjectFileGenerator::generate(Node* tree) {
7070
case NT_EXPRESSIONS:
7171
case NT_INHERITANCESET:
7272
case NT_PROVISIONS:
73-
case NT_INJECTION:
74-
case NT_INJECTION_ARGS:
75-
case NT_INJECTION_ARG:
7673
case NT_CTOR:
7774
case NT_PARENT:
7875
case NT_LAMBDA_INVOCATION:
76+
case NT_INJECTION:
7977
{
8078
int i;
8179
for(i = 0; i < tree->subnodes; i++)
@@ -205,6 +203,13 @@ void ObjectFileGenerator::generate(Node* tree) {
205203
file << "return this.";
206204
header->addPropertyUsage(file.tellp(), classes->find(classname)->getProvisionSymbol(tree->node_data.nodes[1]->node_data.type));
207205
file << "();";
206+
} else if(tree->node_data.nodes[1]->node_type == NT_INJECTION) {
207+
file << "return new ";
208+
string provisionname = tree->node_data.nodes[0]->node_data.type->typedata._class.classname;
209+
header->addClassUsage(file.tellp(), provisionname);
210+
file << "(";
211+
generate(tree->node_data.nodes[1]);
212+
file << ");";
208213
} else if(tree->node_data.nodes[1]->node_type == NT_STRINGLIT || tree->node_data.nodes[1]->node_type == NT_NUMBERLIT || tree->node_data.nodes[1]->node_type == NT_BOOLLIT) {
209214
file << "return ";
210215
generate(tree->node_data.nodes[1]);
@@ -215,6 +220,23 @@ void ObjectFileGenerator::generate(Node* tree) {
215220
file << "};";
216221
break;
217222

223+
case NT_INJECTION_ARGS:
224+
{
225+
bool first = true;
226+
for(int i = 0; i < tree->subnodes; i++) {
227+
if(first) {
228+
first = false;
229+
} else {
230+
file << ",";
231+
}
232+
233+
file << "this.";
234+
header->addPropertyUsage(file.tellp(), classes->find(classname)->getProvisionSymbol(tree->node_data.nodes[i]->node_data.type));
235+
file << "()";
236+
}
237+
}
238+
break;
239+
218240
case NT_CTOR_ARGS:
219241
break;
220242

@@ -393,8 +415,18 @@ void ObjectFileGenerator::generate(Node* tree) {
393415
case NT_TYPEDATA:
394416
{
395417
Type* type = copyType(tree->node_data.type);
396-
if(forceArrayIdentifier) type->arrayed = 1;
418+
if(forceArrayIdentifier) {
419+
if(type->type == TYPE_LIST) {
420+
type->typedata.list.levels++;
421+
} else {
422+
Type* contained = type;
423+
type = MakeType(TYPE_LIST);
424+
type->typedata.list.levels = 1;
425+
type->typedata.list.contained = contained;
426+
}
427+
}
397428
file << table.getAddress(type);
429+
freeType(type);
398430
}
399431
break;
400432

0 commit comments

Comments
 (0)