zig/src/parser.hpp

240 lines
4.7 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"
#include "errmsg.hpp"
2015-11-04 13:31:27 +08:00
struct AstNode;
2015-11-24 15:35:23 +08:00
struct CodeGenNode;
struct ImportTableEntry;
2015-11-04 13:31:27 +08:00
enum NodeType {
NodeTypeRoot,
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,
NodeTypeDirective,
2015-11-28 15:40:54 +08:00
NodeTypeReturnExpr,
2015-12-03 07:33:06 +08:00
NodeTypeVariableDeclaration,
NodeTypeBinOpExpr,
2015-11-28 15:40:54 +08:00
NodeTypeCastExpr,
2015-11-30 08:16:32 +08:00
NodeTypeNumberLiteral,
NodeTypeStringLiteral,
NodeTypeUnreachable,
NodeTypeSymbol,
NodeTypePrefixOpExpr,
2015-11-30 05:39:11 +08:00
NodeTypeFnCallExpr,
NodeTypeUse,
NodeTypeVoid,
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
};
enum FnProtoVisibMod {
FnProtoVisibModPrivate,
FnProtoVisibModPub,
FnProtoVisibModExport,
};
2015-11-24 17:43:45 +08:00
struct AstNodeFnProto {
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,
};
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
};
2015-11-28 15:40:54 +08:00
struct AstNodeReturnExpr {
// might be null in case of return void;
AstNode *expr;
};
2015-12-03 07:33:06 +08:00
struct AstNodeVariableDeclaration {
Buf symbol;
// one or both of type and expr will be non null
AstNode *type;
AstNode *expr;
};
enum BinOpType {
BinOpTypeInvalid,
// TODO: include assignment?
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;
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-11-24 17:43:45 +08:00
struct AstNodeExternBlock {
ZigList<AstNode *> *directives;
2015-11-24 17:43:45 +08:00
ZigList<AstNode *> fn_decls;
};
struct AstNodeDirective {
Buf name;
Buf param;
};
struct AstNodeRootExportDecl {
Buf type;
Buf name;
ZigList<AstNode *> *directives;
};
2015-11-28 15:40:54 +08:00
struct AstNodeCastExpr {
AstNode *prefix_op_expr;
2015-11-28 15:40:54 +08:00
// if type is non-null, do cast, otherwise nothing
AstNode *type;
};
enum PrefixOp {
PrefixOpInvalid,
PrefixOpBoolNot,
PrefixOpBinNot,
PrefixOpNegation,
2015-11-30 04:37:55 +08:00
};
struct AstNodePrefixOpExpr {
PrefixOp prefix_op;
2015-11-30 04:37:55 +08:00
AstNode *primary_expr;
};
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;
int line;
int column;
2015-11-24 15:35:23 +08:00
CodeGenNode *codegen_node;
ImportTableEntry *owner;
2015-11-04 13:31:27 +08:00
union {
AstNodeRoot root;
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;
AstNodeBinOpExpr bin_op_expr;
2015-11-24 17:43:45 +08:00
AstNodeExternBlock extern_block;
AstNodeDirective directive;
2015-11-28 15:40:54 +08:00
AstNodeCastExpr cast_expr;
AstNodePrefixOpExpr prefix_op_expr;
2015-11-30 05:39:11 +08:00
AstNodeFnCallExpr fn_call_expr;
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-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
2015-11-04 13:31:27 +08:00
// This function is provided by generated code, generated by parsergen.cpp
AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens, ImportTableEntry *owner, ErrColor err_color);
2015-11-04 13:31:27 +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