zig/src/parser.hpp

151 lines
2.8 KiB
C++
Raw Normal View History

/*
* Copyright (c) 2015 Andrew Kelley
*
* This file is part of zig, which is MIT licensed.
* See http://opensource.org/licenses/MIT
*/
2015-11-04 13:31:27 +08:00
#ifndef ZIG_PARSER_HPP
#define ZIG_PARSER_HPP
#include "list.hpp"
#include "buffer.hpp"
#include "tokenizer.hpp"
struct AstNode;
2015-11-24 15:35:23 +08:00
struct CodeGenNode;
2015-11-04 13:31:27 +08:00
enum NodeType {
NodeTypeRoot,
2015-11-24 17:43:45 +08:00
NodeTypeFnProto,
NodeTypeFnDef,
2015-11-04 13:31:27 +08:00
NodeTypeFnDecl,
NodeTypeParamDecl,
NodeTypeType,
NodeTypeBlock,
NodeTypeStatement,
NodeTypeExpression,
NodeTypeFnCall,
2015-11-24 17:43:45 +08:00
NodeTypeExternBlock,
2015-11-04 13:31:27 +08:00
};
struct AstNodeRoot {
2015-11-24 17:43:45 +08:00
ZigList<AstNode *> top_level_decls;
2015-11-04 13:31:27 +08:00
};
2015-11-24 17:43:45 +08:00
struct AstNodeFnProto {
2015-11-04 13:31:27 +08:00
Buf name;
ZigList<AstNode *> params;
AstNode *return_type;
2015-11-24 17:43:45 +08:00
};
struct AstNodeFnDef {
AstNode *fn_proto;
2015-11-04 13:31:27 +08:00
AstNode *body;
};
2015-11-24 17:43:45 +08:00
struct AstNodeFnDecl {
AstNode *fn_proto;
};
2015-11-04 13:31:27 +08:00
struct AstNodeParamDecl {
Buf name;
AstNode *type;
};
enum AstNodeTypeType {
AstNodeTypeTypePrimitive,
AstNodeTypeTypePointer,
};
struct AstNodeType {
AstNodeTypeType type;
Buf primitive_name;
AstNode *child_type;
bool is_const;
2015-11-04 13:31:27 +08:00
};
struct AstNodeBlock {
ZigList<AstNode *> statements;
2015-11-04 13:31:27 +08:00
};
enum AstNodeStatementType {
AstNodeStatementTypeExpression,
AstNodeStatementTypeReturn,
};
struct AstNodeStatementExpression {
AstNode *expression;
};
struct AstNodeStatementReturn {
AstNode *expression;
};
struct AstNodeStatement {
AstNodeStatementType type;
union {
AstNodeStatementExpression expr;
AstNodeStatementReturn retrn;
} data;
};
enum AstNodeExpressionType {
AstNodeExpressionTypeNumber,
AstNodeExpressionTypeString,
AstNodeExpressionTypeFnCall,
2015-11-04 13:31:27 +08:00
};
struct AstNodeExpression {
AstNodeExpressionType type;
union {
Buf number;
Buf string;
AstNode *fn_call;
} data;
2015-11-04 13:31:27 +08:00
};
struct AstNodeFnCall {
Buf name;
ZigList<AstNode *> params;
};
2015-11-24 17:43:45 +08:00
struct AstNodeExternBlock {
ZigList<AstNode *> fn_decls;
};
2015-11-04 13:31:27 +08:00
struct AstNode {
enum NodeType type;
AstNode *parent;
int line;
int column;
2015-11-24 15:35:23 +08:00
CodeGenNode *codegen_node;
2015-11-04 13:31:27 +08:00
union {
AstNodeRoot root;
2015-11-24 17:43:45 +08:00
AstNodeFnDef fn_def;
2015-11-04 13:31:27 +08:00
AstNodeFnDecl fn_decl;
2015-11-24 17:43:45 +08:00
AstNodeFnProto fn_proto;
2015-11-04 13:31:27 +08:00
AstNodeType type;
AstNodeParamDecl param_decl;
AstNodeBlock block;
AstNodeStatement statement;
2015-11-04 13:31:27 +08:00
AstNodeExpression expression;
AstNodeFnCall fn_call;
2015-11-24 17:43:45 +08:00
AstNodeExternBlock extern_block;
2015-11-04 13:31:27 +08:00
} data;
};
__attribute__ ((format (printf, 2, 3)))
void ast_token_error(Token *token, const char *format, ...);
2015-11-07 19:50:48 +08:00
void ast_invalid_token_error(Buf *buf, Token *token);
2015-11-04 13:31:27 +08:00
// This function is provided by generated code, generated by parsergen.cpp
2015-11-04 13:31:27 +08:00
AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens);
const char *node_type_str(NodeType node_type);
void ast_print(AstNode *node, int indent);
2015-11-04 13:31:27 +08:00
#endif