zig/src/parser.hpp

150 lines
2.8 KiB
C++

/*
* Copyright (c) 2015 Andrew Kelley
*
* This file is part of zig, which is MIT licensed.
* See http://opensource.org/licenses/MIT
*/
#ifndef ZIG_PARSER_HPP
#define ZIG_PARSER_HPP
#include "list.hpp"
#include "buffer.hpp"
#include "tokenizer.hpp"
struct AstNode;
struct CodeGenNode;
enum NodeType {
NodeTypeRoot,
NodeTypeFnProto,
NodeTypeFnDef,
NodeTypeFnDecl,
NodeTypeParamDecl,
NodeTypeType,
NodeTypeBlock,
NodeTypeExpression,
NodeTypeFnCall,
NodeTypeExternBlock,
NodeTypeDirective,
NodeTypeStatementReturn,
};
struct AstNodeRoot {
ZigList<AstNode *> top_level_decls;
};
enum FnProtoVisibMod {
FnProtoVisibModPrivate,
FnProtoVisibModPub,
FnProtoVisibModExport,
};
struct AstNodeFnProto {
ZigList<AstNode *> *directives;
FnProtoVisibMod visib_mod;
Buf name;
ZigList<AstNode *> params;
AstNode *return_type;
};
struct AstNodeFnDef {
AstNode *fn_proto;
AstNode *body;
};
struct AstNodeFnDecl {
AstNode *fn_proto;
};
struct AstNodeParamDecl {
Buf name;
AstNode *type;
};
enum AstNodeTypeType {
AstNodeTypeTypePrimitive,
AstNodeTypeTypePointer,
};
struct AstNodeType {
AstNodeTypeType type;
Buf primitive_name;
AstNode *child_type;
bool is_const;
};
struct AstNodeBlock {
ZigList<AstNode *> statements;
};
struct AstNodeStatementReturn {
AstNode *expression;
};
enum AstNodeExpressionType {
AstNodeExpressionTypeNumber,
AstNodeExpressionTypeString,
AstNodeExpressionTypeFnCall,
AstNodeExpressionTypeUnreachable,
};
struct AstNodeExpression {
AstNodeExpressionType type;
union {
Buf number;
Buf string;
AstNode *fn_call;
} data;
};
struct AstNodeFnCall {
Buf name;
ZigList<AstNode *> params;
};
struct AstNodeExternBlock {
ZigList<AstNode *> *directives;
ZigList<AstNode *> fn_decls;
};
struct AstNodeDirective {
Buf name;
Buf param;
};
struct AstNode {
enum NodeType type;
AstNode *parent;
int line;
int column;
CodeGenNode *codegen_node;
union {
AstNodeRoot root;
AstNodeFnDef fn_def;
AstNodeFnDecl fn_decl;
AstNodeFnProto fn_proto;
AstNodeType type;
AstNodeParamDecl param_decl;
AstNodeBlock block;
AstNodeStatementReturn statement_return;
AstNodeExpression expression;
AstNodeFnCall fn_call;
AstNodeExternBlock extern_block;
AstNodeDirective directive;
} data;
};
__attribute__ ((format (printf, 2, 3)))
void ast_token_error(Token *token, const char *format, ...);
// This function is provided by generated code, generated by parsergen.cpp
AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens);
const char *node_type_str(NodeType node_type);
void ast_print(AstNode *node, int indent);
#endif