2015-11-25 04:00:38 +08:00
|
|
|
/*
|
|
|
|
* 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;
|
2015-11-24 12:30:12 +08:00
|
|
|
Buf primitive_name;
|
|
|
|
AstNode *child_type;
|
|
|
|
bool is_const;
|
2015-11-04 13:31:27 +08:00
|
|
|
};
|
|
|
|
|
2015-11-24 12:30:12 +08:00
|
|
|
struct AstNodeBlock {
|
|
|
|
ZigList<AstNode *> statements;
|
2015-11-04 13:31:27 +08:00
|
|
|
};
|
|
|
|
|
2015-11-24 12:30:12 +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 {
|
2015-11-24 12:30:12 +08:00
|
|
|
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;
|
2015-11-24 13:47:25 +08:00
|
|
|
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;
|
2015-11-24 12:30:12 +08:00
|
|
|
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)))
|
2015-11-24 12:30:12 +08:00
|
|
|
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
|
|
|
|
2015-11-05 08:15:46 +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);
|
|
|
|
|
2015-11-05 08:15:46 +08:00
|
|
|
const char *node_type_str(NodeType node_type);
|
|
|
|
|
|
|
|
void ast_print(AstNode *node, int indent);
|
|
|
|
|
2015-11-04 13:31:27 +08:00
|
|
|
#endif
|