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"
|
2015-12-01 16:06:10 +08:00
|
|
|
#include "errmsg.hpp"
|
2015-11-04 13:31:27 +08:00
|
|
|
|
|
|
|
struct AstNode;
|
2015-11-24 15:35:23 +08:00
|
|
|
struct CodeGenNode;
|
2015-12-01 15:50:11 +08:00
|
|
|
struct ImportTableEntry;
|
2015-11-04 13:31:27 +08:00
|
|
|
|
|
|
|
enum NodeType {
|
|
|
|
NodeTypeRoot,
|
2015-11-28 12:24:11 +08:00
|
|
|
NodeTypeRootExportDecl,
|
2015-11-24 17:43:45 +08:00
|
|
|
NodeTypeFnProto,
|
|
|
|
NodeTypeFnDef,
|
2015-11-04 13:31:27 +08:00
|
|
|
NodeTypeFnDecl,
|
|
|
|
NodeTypeParamDecl,
|
|
|
|
NodeTypeType,
|
|
|
|
NodeTypeBlock,
|
2015-11-24 17:43:45 +08:00
|
|
|
NodeTypeExternBlock,
|
2015-11-25 14:44:41 +08:00
|
|
|
NodeTypeDirective,
|
2015-11-28 15:40:54 +08:00
|
|
|
NodeTypeReturnExpr,
|
2015-12-03 07:33:06 +08:00
|
|
|
NodeTypeVariableDeclaration,
|
2015-11-30 05:46:05 +08:00
|
|
|
NodeTypeBinOpExpr,
|
2015-11-28 15:40:54 +08:00
|
|
|
NodeTypeCastExpr,
|
2015-11-30 08:16:32 +08:00
|
|
|
NodeTypeNumberLiteral,
|
|
|
|
NodeTypeStringLiteral,
|
|
|
|
NodeTypeUnreachable,
|
|
|
|
NodeTypeSymbol,
|
2015-11-30 05:00:34 +08:00
|
|
|
NodeTypePrefixOpExpr,
|
2015-11-30 05:39:11 +08:00
|
|
|
NodeTypeFnCallExpr,
|
2015-12-09 05:15:34 +08:00
|
|
|
NodeTypeArrayAccessExpr,
|
2015-12-01 10:58:53 +08:00
|
|
|
NodeTypeUse,
|
2015-12-02 06:54:46 +08:00
|
|
|
NodeTypeVoid,
|
2015-12-04 03:15:07 +08:00
|
|
|
NodeTypeBoolLiteral,
|
2015-12-02 12:19:38 +08:00
|
|
|
NodeTypeIfExpr,
|
2015-12-03 15:47:35 +08:00
|
|
|
NodeTypeLabel,
|
|
|
|
NodeTypeGoto,
|
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-28 06:46:06 +08:00
|
|
|
enum FnProtoVisibMod {
|
|
|
|
FnProtoVisibModPrivate,
|
|
|
|
FnProtoVisibModPub,
|
|
|
|
FnProtoVisibModExport,
|
|
|
|
};
|
|
|
|
|
2015-11-24 17:43:45 +08:00
|
|
|
struct AstNodeFnProto {
|
2015-11-28 06:46:06 +08:00
|
|
|
ZigList<AstNode *> *directives;
|
|
|
|
FnProtoVisibMod visib_mod;
|
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,
|
2015-12-07 23:29:19 +08:00
|
|
|
AstNodeTypeTypeArray,
|
2015-11-04 13:31:27 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeType {
|
|
|
|
AstNodeTypeType type;
|
2015-11-24 12:30:12 +08:00
|
|
|
Buf primitive_name;
|
|
|
|
AstNode *child_type;
|
2015-12-07 23:29:19 +08:00
|
|
|
AstNode *array_size;
|
2015-11-24 12:30:12 +08:00
|
|
|
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-28 15:40:54 +08:00
|
|
|
struct AstNodeReturnExpr {
|
|
|
|
// might be null in case of return void;
|
|
|
|
AstNode *expr;
|
2015-11-24 12:30:12 +08:00
|
|
|
};
|
|
|
|
|
2015-12-03 07:33:06 +08:00
|
|
|
struct AstNodeVariableDeclaration {
|
|
|
|
Buf symbol;
|
2015-12-07 14:09:46 +08:00
|
|
|
bool is_const;
|
2015-12-03 07:33:06 +08:00
|
|
|
// one or both of type and expr will be non null
|
|
|
|
AstNode *type;
|
|
|
|
AstNode *expr;
|
|
|
|
};
|
|
|
|
|
2015-11-30 05:46:05 +08:00
|
|
|
enum BinOpType {
|
|
|
|
BinOpTypeInvalid,
|
2015-12-07 14:09:46 +08:00
|
|
|
BinOpTypeAssign,
|
2015-11-30 05:46:05 +08:00
|
|
|
BinOpTypeBoolOr,
|
|
|
|
BinOpTypeBoolAnd,
|
|
|
|
BinOpTypeCmpEq,
|
|
|
|
BinOpTypeCmpNotEq,
|
|
|
|
BinOpTypeCmpLessThan,
|
|
|
|
BinOpTypeCmpGreaterThan,
|
|
|
|
BinOpTypeCmpLessOrEq,
|
|
|
|
BinOpTypeCmpGreaterOrEq,
|
|
|
|
BinOpTypeBinOr,
|
|
|
|
BinOpTypeBinXor,
|
|
|
|
BinOpTypeBinAnd,
|
|
|
|
BinOpTypeBitShiftLeft,
|
|
|
|
BinOpTypeBitShiftRight,
|
|
|
|
BinOpTypeAdd,
|
|
|
|
BinOpTypeSub,
|
|
|
|
BinOpTypeMult,
|
|
|
|
BinOpTypeDiv,
|
|
|
|
BinOpTypeMod,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeBinOpExpr {
|
2015-11-28 15:40:54 +08:00
|
|
|
AstNode *op1;
|
2015-11-30 05:46:05 +08:00
|
|
|
BinOpType bin_op;
|
2015-11-28 15:40:54 +08:00
|
|
|
AstNode *op2;
|
2015-11-04 13:31:27 +08:00
|
|
|
};
|
|
|
|
|
2015-11-30 05:39:11 +08:00
|
|
|
struct AstNodeFnCallExpr {
|
|
|
|
AstNode *fn_ref_expr;
|
2015-11-04 13:31:27 +08:00
|
|
|
ZigList<AstNode *> params;
|
|
|
|
};
|
|
|
|
|
2015-12-09 05:15:34 +08:00
|
|
|
struct AstNodeArrayAccessExpr {
|
|
|
|
AstNode *array_ref_expr;
|
|
|
|
AstNode *subscript;
|
|
|
|
};
|
|
|
|
|
2015-11-24 17:43:45 +08:00
|
|
|
struct AstNodeExternBlock {
|
2015-11-25 14:44:41 +08:00
|
|
|
ZigList<AstNode *> *directives;
|
2015-11-24 17:43:45 +08:00
|
|
|
ZigList<AstNode *> fn_decls;
|
|
|
|
};
|
|
|
|
|
2015-11-25 14:44:41 +08:00
|
|
|
struct AstNodeDirective {
|
|
|
|
Buf name;
|
|
|
|
Buf param;
|
|
|
|
};
|
|
|
|
|
2015-11-28 12:24:11 +08:00
|
|
|
struct AstNodeRootExportDecl {
|
|
|
|
Buf type;
|
|
|
|
Buf name;
|
2015-11-30 17:11:31 +08:00
|
|
|
ZigList<AstNode *> *directives;
|
2015-11-28 12:24:11 +08:00
|
|
|
};
|
|
|
|
|
2015-11-28 15:40:54 +08:00
|
|
|
struct AstNodeCastExpr {
|
2015-11-30 05:00:34 +08:00
|
|
|
AstNode *prefix_op_expr;
|
2015-11-28 15:40:54 +08:00
|
|
|
// if type is non-null, do cast, otherwise nothing
|
|
|
|
AstNode *type;
|
|
|
|
};
|
|
|
|
|
2015-11-30 05:00:34 +08:00
|
|
|
enum PrefixOp {
|
|
|
|
PrefixOpInvalid,
|
|
|
|
PrefixOpBoolNot,
|
|
|
|
PrefixOpBinNot,
|
|
|
|
PrefixOpNegation,
|
2015-11-30 04:37:55 +08:00
|
|
|
};
|
|
|
|
|
2015-11-30 05:00:34 +08:00
|
|
|
struct AstNodePrefixOpExpr {
|
|
|
|
PrefixOp prefix_op;
|
2015-11-30 04:37:55 +08:00
|
|
|
AstNode *primary_expr;
|
|
|
|
};
|
|
|
|
|
2015-12-01 10:58:53 +08:00
|
|
|
struct AstNodeUse {
|
|
|
|
Buf path;
|
|
|
|
ZigList<AstNode *> *directives;
|
|
|
|
};
|
|
|
|
|
2015-12-02 12:19:38 +08:00
|
|
|
struct AstNodeIfExpr {
|
|
|
|
AstNode *condition;
|
|
|
|
AstNode *then_block;
|
|
|
|
AstNode *else_node; // null, block node, or other if expr node
|
|
|
|
};
|
|
|
|
|
2015-12-03 15:47:35 +08:00
|
|
|
struct AstNodeLabel {
|
|
|
|
Buf name;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeGoto {
|
|
|
|
Buf name;
|
|
|
|
};
|
|
|
|
|
2015-11-04 13:31:27 +08:00
|
|
|
struct AstNode {
|
|
|
|
enum NodeType type;
|
2015-11-24 13:47:25 +08:00
|
|
|
int line;
|
|
|
|
int column;
|
2015-11-24 15:35:23 +08:00
|
|
|
CodeGenNode *codegen_node;
|
2015-12-01 15:50:11 +08:00
|
|
|
ImportTableEntry *owner;
|
2015-11-04 13:31:27 +08:00
|
|
|
union {
|
|
|
|
AstNodeRoot root;
|
2015-11-28 12:24:11 +08:00
|
|
|
AstNodeRootExportDecl root_export_decl;
|
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-28 15:40:54 +08:00
|
|
|
AstNodeReturnExpr return_expr;
|
2015-12-03 07:33:06 +08:00
|
|
|
AstNodeVariableDeclaration variable_declaration;
|
2015-11-30 05:46:05 +08:00
|
|
|
AstNodeBinOpExpr bin_op_expr;
|
2015-11-24 17:43:45 +08:00
|
|
|
AstNodeExternBlock extern_block;
|
2015-11-25 14:44:41 +08:00
|
|
|
AstNodeDirective directive;
|
2015-11-28 15:40:54 +08:00
|
|
|
AstNodeCastExpr cast_expr;
|
2015-11-30 05:00:34 +08:00
|
|
|
AstNodePrefixOpExpr prefix_op_expr;
|
2015-11-30 05:39:11 +08:00
|
|
|
AstNodeFnCallExpr fn_call_expr;
|
2015-12-09 05:15:34 +08:00
|
|
|
AstNodeArrayAccessExpr array_access_expr;
|
2015-12-01 10:58:53 +08:00
|
|
|
AstNodeUse use;
|
2015-12-02 12:19:38 +08:00
|
|
|
AstNodeIfExpr if_expr;
|
2015-12-03 15:47:35 +08:00
|
|
|
AstNodeLabel label;
|
|
|
|
AstNodeGoto go_to;
|
2015-11-30 08:16:32 +08:00
|
|
|
Buf number;
|
|
|
|
Buf string;
|
|
|
|
Buf symbol;
|
2015-12-04 03:15:07 +08:00
|
|
|
bool bool_literal;
|
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
|
|
|
|
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-12-01 16:06:10 +08:00
|
|
|
AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens, ImportTableEntry *owner, ErrColor err_color);
|
2015-11-04 13:31:27 +08:00
|
|
|
|
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
|