zig/src/parser.hpp

321 lines
6.1 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-12-11 06:34:38 +08:00
struct AsmToken;
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,
2015-12-09 05:15:34 +08:00
NodeTypeArrayAccessExpr,
NodeTypeFieldAccessExpr,
NodeTypeUse,
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-12-11 06:34:38 +08:00
NodeTypeAsmExpr,
NodeTypeStructDecl,
NodeTypeStructField,
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;
bool is_var_args;
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;
Buf primitive_name;
AstNode *child_type;
2015-12-07 23:29:19 +08:00
AstNode *array_size;
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;
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;
};
enum BinOpType {
BinOpTypeInvalid,
2015-12-07 14:09:46 +08:00
BinOpTypeAssign,
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-12-09 05:15:34 +08:00
struct AstNodeArrayAccessExpr {
AstNode *array_ref_expr;
AstNode *subscript;
};
struct AstNodeFieldAccessExpr {
AstNode *struct_expr;
Buf field_name;
};
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 {
2015-12-11 18:55:26 +08:00
AstNode *expr;
2015-11-28 15:40:54 +08:00
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-12-11 18:55:26 +08:00
struct AsmOutput {
Buf asm_symbolic_name;
Buf constraint;
Buf variable_name;
};
struct AsmInput {
Buf asm_symbolic_name;
Buf constraint;
AstNode *expr;
};
struct SrcPos {
int line;
int column;
};
2015-12-11 06:34:38 +08:00
struct AstNodeAsmExpr {
bool is_volatile;
Buf asm_template;
2015-12-11 18:55:26 +08:00
ZigList<SrcPos> offset_map;
2015-12-11 06:34:38 +08:00
ZigList<AsmToken> token_list;
2015-12-11 18:55:26 +08:00
ZigList<AsmOutput*> output_list;
ZigList<AsmInput*> input_list;
ZigList<Buf*> clobber_list;
2015-12-11 06:34:38 +08:00
};
struct AstNodeStructDecl {
Buf name;
ZigList<AstNode *> fields;
ZigList<AstNode *> *directives;
};
struct AstNodeStructField {
Buf name;
AstNode *type;
};
struct AstNodeStringLiteral {
Buf buf;
bool c;
};
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;
2015-12-09 05:15:34 +08:00
AstNodeArrayAccessExpr array_access_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-12-11 06:34:38 +08:00
AstNodeAsmExpr asm_expr;
AstNodeFieldAccessExpr field_access_expr;
AstNodeStructDecl struct_decl;
AstNodeStructField struct_field;
AstNodeStringLiteral string_literal;
2015-11-30 08:16:32 +08:00
Buf number;
Buf symbol;
2015-12-04 03:15:07 +08:00
bool bool_literal;
2015-11-04 13:31:27 +08:00
} data;
};
2015-12-11 06:34:38 +08:00
enum AsmTokenId {
AsmTokenIdTemplate,
AsmTokenIdPercent,
2015-12-11 18:55:26 +08:00
AsmTokenIdVar,
2015-12-11 06:34:38 +08:00
};
struct AsmToken {
enum AsmTokenId id;
int start;
int end;
};
2015-11-04 13:31:27 +08:00
__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