Separate the AST from the parser state.

This commit is contained in:
Randy Heit 2013-10-23 22:49:02 -05:00
parent dbc9fd6c0e
commit d0968af9a6
3 changed files with 45 additions and 22 deletions

View file

@ -2,19 +2,9 @@
{
// Allocates a new AST node off the parse state's arena.
#define NEW_AST_NODE(type,name,tok) \
ZCC_##type *name = static_cast<ZCC_##type *>(InitNode(sizeof(ZCC_##type), AST_##type, stat)); \
ZCC_##type *name = static_cast<ZCC_##type *>(stat->InitNode(sizeof(ZCC_##type), AST_##type)); \
SetNodeLine(name, tok)
static ZCC_TreeNode *InitNode(size_t size, EZCCTreeNodeType type, ZCCParseState *stat)
{
ZCC_TreeNode *node = (ZCC_TreeNode *)stat->SyntaxArena.Alloc(size);
node->SiblingNext = node;
node->SiblingPrev = node;
node->NodeType = type;
node->SourceName = stat->Strings.Alloc(stat->sc.ScriptName);
return node;
}
static void SetNodeLine(ZCC_TreeNode *name, ZCCToken &tok)
{
name->SourceLoc = tok.SourceLoc;

View file

@ -297,3 +297,24 @@ static FString ZCCTokenName(int terminal)
}
return FScanner::TokenName(sc_token);
}
ZCC_TreeNode *ZCC_AST::InitNode(size_t size, EZCCTreeNodeType type, ZCC_TreeNode *basis)
{
ZCC_TreeNode *node = (ZCC_TreeNode *)SyntaxArena.Alloc(size);
node->SiblingNext = node;
node->SiblingPrev = node;
node->NodeType = type;
if (basis != NULL)
{
node->SourceName = basis->SourceName;
node->SourceLoc = basis->SourceLoc;
}
return node;
}
ZCC_TreeNode *ZCCParseState::InitNode(size_t size, EZCCTreeNodeType type)
{
ZCC_TreeNode *node = ZCC_AST::InitNode(size, type, NULL);
node->SourceName = Strings.Alloc(sc.ScriptName);
return node;
}

View file

@ -1,15 +1,7 @@
struct ZCCParseState
{
ZCCParseState(FScanner &scanner) : sc(scanner)
{
TopNode = NULL;
}
#ifndef ZCC_PARSER_H
#define ZCC_PARSER_H
FScanner &sc;
FSharedStringArena Strings;
FMemArena SyntaxArena;
struct ZCC_TreeNode *TopNode;
};
#include "memarena.h"
struct ZCCToken
{
@ -500,3 +492,23 @@ struct ZCC_FuncDeclarator : ZCC_Declarator
};
FString ZCC_PrintAST(ZCC_TreeNode *root);
struct ZCC_AST
{
ZCC_AST() : TopNode(NULL) {}
ZCC_TreeNode *InitNode(size_t size, EZCCTreeNodeType type, ZCC_TreeNode *basis);
FSharedStringArena Strings;
FMemArena SyntaxArena;
struct ZCC_TreeNode *TopNode;
};
struct ZCCParseState : public ZCC_AST
{
ZCCParseState(FScanner &scanner) : sc(scanner) {}
ZCC_TreeNode *InitNode(size_t size, EZCCTreeNodeType type);
FScanner &sc;
};
#endif