forked from cosmonaut/wraith-lang
some minor style revisions
parent
f441e5bede
commit
41bf2bece8
12
src/ast.h
12
src/ast.h
|
@ -74,20 +74,20 @@ typedef union
|
||||||
|
|
||||||
typedef struct TypeTag
|
typedef struct TypeTag
|
||||||
{
|
{
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
Unknown,
|
Unknown,
|
||||||
Primitive,
|
Primitive,
|
||||||
Reference,
|
Reference,
|
||||||
Custom
|
Custom
|
||||||
} type;
|
} type;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
// Valid when type = Primitive.
|
/* Valid when type = Primitive. */
|
||||||
PrimitiveType primitiveType;
|
PrimitiveType primitiveType;
|
||||||
// Valid when type = Reference.
|
/* Valid when type = Reference. */
|
||||||
struct TypeTag *referenceType;
|
struct TypeTag *referenceType;
|
||||||
// Valid when type = Custom.
|
/* Valid when type = Custom. */
|
||||||
char *customType;
|
char *customType;
|
||||||
} value;
|
} value;
|
||||||
} TypeTag;
|
} TypeTag;
|
||||||
|
@ -108,7 +108,7 @@ typedef struct Node
|
||||||
uint64_t number;
|
uint64_t number;
|
||||||
} value;
|
} value;
|
||||||
PrimitiveType primitiveType;
|
PrimitiveType primitiveType;
|
||||||
TypeTag *typeTag;
|
TypeTag *typeTag;
|
||||||
IdNode *idLink;
|
IdNode *idLink;
|
||||||
} Node;
|
} Node;
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@ void AddChildToNode(IdNode *node, IdNode *child) {
|
||||||
|
|
||||||
if (node->children == NULL) {
|
if (node->children == NULL) {
|
||||||
node->childCapacity = 2;
|
node->childCapacity = 2;
|
||||||
node->children = (IdNode**)malloc(sizeof(IdNode*) * node->childCapacity);
|
node->children = (IdNode**) malloc(sizeof(IdNode*) * node->childCapacity);
|
||||||
} else if (node->childCount == node->childCapacity) {
|
} else if (node->childCount == node->childCapacity) {
|
||||||
node->childCapacity *= 2;
|
node->childCapacity *= 2;
|
||||||
node->children = realloc(node->children, sizeof(IdNode*) * node->childCapacity);
|
node->children = (IdNode**) realloc(node->children, sizeof(IdNode*) * node->childCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
node->children[node->childCount] = child;
|
node->children[node->childCount] = child;
|
||||||
|
@ -167,20 +167,20 @@ void PrintIdNode(IdNode *node) {
|
||||||
case Placeholder:
|
case Placeholder:
|
||||||
printf("Placeholder (%s)\n", node->name);
|
printf("Placeholder (%s)\n", node->name);
|
||||||
break;
|
break;
|
||||||
case OrderedScope:
|
case OrderedScope:
|
||||||
printf("OrderedScope (%s)\n", node->name);
|
printf("OrderedScope (%s)\n", node->name);
|
||||||
break;
|
break;
|
||||||
case UnorderedScope:
|
case UnorderedScope:
|
||||||
printf("UnorderedScope (%s)\n", node->name);
|
printf("UnorderedScope (%s)\n", node->name);
|
||||||
break;
|
break;
|
||||||
case Struct:
|
case Struct:
|
||||||
printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));
|
printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));
|
||||||
break;
|
break;
|
||||||
case Function:
|
case Function:
|
||||||
printf("%s : Function<%s>\n", node->name, TypeTagToString(node->typeTag));
|
printf("%s : Function<%s>\n", node->name, TypeTagToString(node->typeTag));
|
||||||
break;
|
break;
|
||||||
case Variable:
|
case Variable:
|
||||||
printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));
|
printf("%s : %s\n", node->name, TypeTagToString(node->typeTag));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ IdNode* LookdownId(IdNode *root, NodeType targetType, char *targetName) {
|
||||||
}
|
}
|
||||||
size_t newSize = frontierCount + current->childCount - 1;
|
size_t newSize = frontierCount + current->childCount - 1;
|
||||||
if (frontierCount != newSize) {
|
if (frontierCount != newSize) {
|
||||||
frontier = realloc(frontier, sizeof(IdNode*) * newSize);
|
frontier = (IdNode**) realloc(frontier, sizeof(IdNode*) * newSize);
|
||||||
}
|
}
|
||||||
for (i = 0; i < current->childCount; i++) {
|
for (i = 0; i < current->childCount; i++) {
|
||||||
frontier[frontierCount + i - 1] = current->children[i];
|
frontier[frontierCount + i - 1] = current->children[i];
|
||||||
|
@ -258,7 +258,7 @@ bool ScopeHasOrdering(IdNode *node) {
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case OrderedScope:
|
case OrderedScope:
|
||||||
case Function:
|
case Function:
|
||||||
case Variable: // this is only technically true
|
case Variable: /* this is only technically true */
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -274,20 +274,22 @@ IdNode* LookupId(IdNode *node, IdNode *prev, char *target) {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is the start of our search, we should not attempt to look at child nodes. Only
|
/* If this is the start of our search, we should not attempt to look at child nodes. Only
|
||||||
// looking up the scope tree is valid at this point.
|
* looking up the scope tree is valid at this point.
|
||||||
//
|
*
|
||||||
// This has the notable side-effect that this function will return NULL if you attempt to look
|
* This has the notable side-effect that this function will return NULL if you attempt to look
|
||||||
// up a struct's internals starting from the node representing the struct itself. This is
|
* up a struct's internals starting from the node representing the struct itself. This is
|
||||||
// because an IdNode corresponds to the location *where an identifier is first declared.* Thus,
|
* because an IdNode corresponds to the location *where an identifier is first declared.* Thus,
|
||||||
// an identifier has no knowledge of identifiers declared "inside" of it.
|
* an identifier has no knowledge of identifiers declared "inside" of it.
|
||||||
|
*/
|
||||||
if (prev == NULL) {
|
if (prev == NULL) {
|
||||||
return LookupId(node->parent, node, target);
|
return LookupId(node->parent, node, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the current node forms an ordered scope then we want to prevent ourselves from looking
|
||||||
|
* up identifiers declared after the scope we have just come from.
|
||||||
|
*/
|
||||||
uint32_t idxLimit;
|
uint32_t idxLimit;
|
||||||
// If the current node forms an ordered scope then we want to prevent ourselves from looking
|
|
||||||
// up identifiers declared after the scope we have just come from.
|
|
||||||
if (ScopeHasOrdering(node)) {
|
if (ScopeHasOrdering(node)) {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
for (i = 0, idxLimit = 0; i < node->childCount; i++, idxLimit++) {
|
for (i = 0, idxLimit = 0; i < node->childCount; i++, idxLimit++) {
|
||||||
|
@ -303,13 +305,13 @@ IdNode* LookupId(IdNode *node, IdNode *prev, char *target) {
|
||||||
for (i = 0; i < idxLimit; i++) {
|
for (i = 0; i < idxLimit; i++) {
|
||||||
IdNode *child = node->children[i];
|
IdNode *child = node->children[i];
|
||||||
if (child == prev || child->type == Placeholder) {
|
if (child == prev || child->type == Placeholder) {
|
||||||
// Do not inspect the node we just came from or placeholders.
|
/* Do not inspect the node we just came from or placeholders. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(child->name, target) == 0) {
|
if (strcmp(child->name, target) == 0) {
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (child->type == Struct) {
|
if (child->type == Struct) {
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
|
@ -317,7 +319,7 @@ IdNode* LookupId(IdNode *node, IdNode *prev, char *target) {
|
||||||
IdNode *grandchild = child->children[j];
|
IdNode *grandchild = child->children[j];
|
||||||
if (strcmp(grandchild->name, target) == 0) {
|
if (strcmp(grandchild->name, target) == 0) {
|
||||||
return grandchild;
|
return grandchild;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// Validates identifier usage in an AST.
|
/* Validates identifier usage in an AST. */
|
||||||
|
|
||||||
#ifndef WRAITH_IDENTCHECK_H
|
#ifndef WRAITH_IDENTCHECK_H
|
||||||
#define WRAITH_IDENTCHECK_H
|
#define WRAITH_IDENTCHECK_H
|
||||||
|
|
||||||
|
@ -42,6 +43,4 @@ int PrintAncestors(IdNode *node);
|
||||||
IdNode* LookdownId(IdNode *root, NodeType targetType, char *targetName);
|
IdNode* LookdownId(IdNode *root, NodeType targetType, char *targetName);
|
||||||
IdNode* LookupId(IdNode *node, IdNode *prev, char* target);
|
IdNode* LookupId(IdNode *node, IdNode *prev, char* target);
|
||||||
|
|
||||||
//IdStatus CheckIds(Node *root);
|
|
||||||
|
|
||||||
#endif /* WRAITH_IDENTCHECK_H */
|
#endif /* WRAITH_IDENTCHECK_H */
|
||||||
|
|
Loading…
Reference in New Issue