mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-16 01:11:50 +00:00
Separate the AST from the parser state.
This commit is contained in:
parent
dbc9fd6c0e
commit
d0968af9a6
3 changed files with 45 additions and 22 deletions
|
@ -2,19 +2,9 @@
|
||||||
{
|
{
|
||||||
// Allocates a new AST node off the parse state's arena.
|
// Allocates a new AST node off the parse state's arena.
|
||||||
#define NEW_AST_NODE(type,name,tok) \
|
#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)
|
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)
|
static void SetNodeLine(ZCC_TreeNode *name, ZCCToken &tok)
|
||||||
{
|
{
|
||||||
name->SourceLoc = tok.SourceLoc;
|
name->SourceLoc = tok.SourceLoc;
|
||||||
|
|
|
@ -297,3 +297,24 @@ static FString ZCCTokenName(int terminal)
|
||||||
}
|
}
|
||||||
return FScanner::TokenName(sc_token);
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -1,15 +1,7 @@
|
||||||
struct ZCCParseState
|
#ifndef ZCC_PARSER_H
|
||||||
{
|
#define ZCC_PARSER_H
|
||||||
ZCCParseState(FScanner &scanner) : sc(scanner)
|
|
||||||
{
|
|
||||||
TopNode = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FScanner ≻
|
#include "memarena.h"
|
||||||
FSharedStringArena Strings;
|
|
||||||
FMemArena SyntaxArena;
|
|
||||||
struct ZCC_TreeNode *TopNode;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ZCCToken
|
struct ZCCToken
|
||||||
{
|
{
|
||||||
|
@ -500,3 +492,23 @@ struct ZCC_FuncDeclarator : ZCC_Declarator
|
||||||
};
|
};
|
||||||
|
|
||||||
FString ZCC_PrintAST(ZCC_TreeNode *root);
|
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 ≻
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue