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-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,
|
|
|
|
NodeTypeFnCall,
|
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,
|
|
|
|
NodeTypeBoolOrExpr,
|
|
|
|
NodeTypeBoolAndExpr,
|
|
|
|
NodeTypeComparisonExpr,
|
|
|
|
NodeTypeBinOrExpr,
|
|
|
|
NodeTypeBinXorExpr,
|
|
|
|
NodeTypeBinAndExpr,
|
|
|
|
NodeTypeBitShiftExpr,
|
|
|
|
NodeTypeAddExpr,
|
|
|
|
NodeTypeMultExpr,
|
|
|
|
NodeTypeCastExpr,
|
|
|
|
NodeTypePrimaryExpr,
|
|
|
|
NodeTypeGroupedExpr,
|
2015-11-04 13:31:27 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeRoot {
|
2015-11-28 12:24:11 +08:00
|
|
|
AstNode *root_export_decl;
|
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,
|
|
|
|
};
|
|
|
|
|
|
|
|
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-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-11-28 15:40:54 +08:00
|
|
|
struct AstNodeBoolOrExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
// if op2 is non-null, do boolean or, otherwise nothing
|
|
|
|
AstNode *op2;
|
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 {
|
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-28 15:40:54 +08:00
|
|
|
struct AstNodeBoolAndExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
// if op2 is non-null, do boolean and, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum CmpOp {
|
|
|
|
CmpOpInvalid,
|
|
|
|
CmpOpEq,
|
|
|
|
CmpOpNotEq,
|
|
|
|
CmpOpLessThan,
|
|
|
|
CmpOpGreaterThan,
|
|
|
|
CmpOpLessOrEq,
|
|
|
|
CmpOpGreaterOrEq,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeComparisonExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
CmpOp cmp_op;
|
|
|
|
// if op2 is non-null, do cmp_op, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeBinOrExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
// if op2 is non-null, do binary or, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeBinXorExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
// if op2 is non-null, do binary xor, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeBinAndExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
// if op2 is non-null, do binary and, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum BitShiftOp {
|
|
|
|
BitShiftOpInvalid,
|
|
|
|
BitShiftOpLeft,
|
|
|
|
BitShiftOpRight,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeBitShiftExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
BitShiftOp bit_shift_op;
|
|
|
|
// if op2 is non-null, do bit_shift_op, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum AddOp {
|
|
|
|
AddOpInvalid,
|
|
|
|
AddOpAdd,
|
|
|
|
AddOpSub,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeAddExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
AddOp add_op;
|
|
|
|
// if op2 is non-null, do add_op, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum MultOp {
|
|
|
|
MultOpInvalid,
|
|
|
|
MultOpMult,
|
|
|
|
MultOpDiv,
|
|
|
|
MultOpMod,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeMultExpr {
|
|
|
|
AstNode *op1;
|
|
|
|
MultOp mult_op;
|
|
|
|
// if op2 is non-null, do mult_op, otherwise nothing
|
|
|
|
AstNode *op2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeCastExpr {
|
|
|
|
AstNode *primary_expr;
|
|
|
|
// if type is non-null, do cast, otherwise nothing
|
|
|
|
AstNode *type;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum PrimaryExprType {
|
|
|
|
PrimaryExprTypeNumber,
|
|
|
|
PrimaryExprTypeString,
|
|
|
|
PrimaryExprTypeUnreachable,
|
|
|
|
PrimaryExprTypeFnCall,
|
|
|
|
PrimaryExprTypeGroupedExpr,
|
|
|
|
PrimaryExprTypeBlock,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodePrimaryExpr {
|
|
|
|
PrimaryExprType type;
|
|
|
|
union {
|
|
|
|
Buf number;
|
|
|
|
Buf string;
|
|
|
|
AstNode *fn_call;
|
|
|
|
AstNode *grouped_expr;
|
|
|
|
AstNode *block;
|
|
|
|
} data;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct AstNodeGroupedExpr {
|
|
|
|
AstNode *expr;
|
|
|
|
};
|
|
|
|
|
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-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;
|
|
|
|
AstNodeBoolOrExpr bool_or_expr;
|
2015-11-04 13:31:27 +08:00
|
|
|
AstNodeFnCall fn_call;
|
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
|
|
|
AstNodeBoolAndExpr bool_and_expr;
|
|
|
|
AstNodeComparisonExpr comparison_expr;
|
|
|
|
AstNodeBinOrExpr bin_or_expr;
|
|
|
|
AstNodeBinXorExpr bin_xor_expr;
|
|
|
|
AstNodeBinAndExpr bin_and_expr;
|
|
|
|
AstNodeBitShiftExpr bit_shift_expr;
|
|
|
|
AstNodeAddExpr add_expr;
|
|
|
|
AstNodeMultExpr mult_expr;
|
|
|
|
AstNodeCastExpr cast_expr;
|
|
|
|
AstNodePrimaryExpr primary_expr;
|
|
|
|
AstNodeGroupedExpr grouped_expr;
|
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-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
|