#include "ast.h"
#include "symbol.h"
-#include "lexer_t.h"
+#include "token_t.h"
#include "type.h"
#include "adt/obst.h"
EXPR_SIZEOF,
} expresion_type_t;
+struct context_t {
+ declaration_t *declarations;
+};
+
struct expression_t {
expresion_type_t type;
type_t *datatype;
};
struct reference_expression_t {
- expression_t expression;
- symbol_t *symbol;
- union {
- variable_declaration_statement_t *variable;
- method_t *method;
- global_variable_t *global_variable;
- method_parameter_t *method_parameter;
- } r;
+ expression_t expression;
+ symbol_t *symbol;
+ declaration_t *declaration;
};
struct call_argument_t {
typedef enum {
UNEXPR_INVALID = 0,
UNEXPR_NEGATE,
+ UNEXPR_PLUS,
UNEXPR_BITWISE_NEGATE,
UNEXPR_NOT,
UNEXPR_DEREFERENCE,
BINEXPR_GREATEREQUAL,
BINEXPR_BITWISE_AND,
BINEXPR_BITWISE_OR,
- BINEXPR_BITWSIE_XOR,
+ BINEXPR_BITWISE_XOR,
BINEXPR_LOGICAL_AND,
BINEXPR_LOGICAL_OR,
BINEXPR_SHIFTLEFT,
};
struct select_expression_t {
- expression_t expression;
- expression_t *compound;
- symbol_t *symbol;
+ expression_t expression;
+ expression_t *compound;
+ symbol_t *symbol;
- compound_entry_t *compound_entry;
+ declaration_t *compound_entry;
};
struct array_access_expression_t {
struct sizeof_expression_t {
expression_t expression;
- union {
- type_t *type;
- expression_t *size_expression;
- } v;
+ type_t *type;
};
struct conditional_expression_t {
expression_list_element_t *expressions;
};
+typedef enum {
+ STORAGE_CLASS_NONE,
+ STORAGE_CLASS_TYPEDEF,
+ STORAGE_CLASS_EXTERN,
+ STORAGE_CLASS_STATIC,
+ STORAGE_CLASS_AUTO,
+ STORAGE_CLASS_REGISTER
+} storage_class_t;
+
+struct method_parameter_t {
+ method_parameter_t *next;
+ symbol_t *symbol;
+ type_t *type;
+ int num;
+};
+
+struct declaration_t {
+ storage_class_t storage_class;
+ type_t *type;
+ symbol_t *symbol;
+ method_parameter_t *parameters;
+ statement_t *statement;
+ source_position_t source_position;
+ context_t context;
+
+ declaration_t *next;
+};
+
typedef enum {
STATEMENT_INVALID,
- STATEMENT_BLOCK,
+ STATEMENT_COMPOUND,
STATEMENT_RETURN,
- STATEMENT_VARIABLE_DECLARATION,
+ STATEMENT_DECLARATION,
STATEMENT_IF,
STATEMENT_EXPRESSION,
STATEMENT_GOTO,
expression_t *return_value;
};
-struct block_statement_t {
+struct compound_statement_t {
statement_t statement;
statement_t *first_statement;
+ context_t context;
};
-struct variable_declaration_statement_t {
- statement_t statement;
- type_t *type;
- symbol_t *symbol;
+struct declaration_statement_t {
+ statement_t statement;
+ declaration_t declaration;
- int value_number; /**< filled in by semantic phase */
- int refs;
+ int value_number; /**< filled in by semantic phase */
+ int refs;
};
struct if_statement_t {
expression_t *expression;
};
-enum namespace_entry_type_t {
- NAMESPACE_ENTRY_INVALID,
- NAMESPACE_ENTRY_METHOD,
- NAMESPACE_ENTRY_VARIABLE,
-};
-
-struct namespace_entry_t {
- namespace_entry_type_t type;
- namespace_entry_t *next;
- source_position_t source_position;
-};
-
-struct method_parameter_t {
- method_parameter_t *next;
- symbol_t *symbol;
- type_t *type;
- int num;
-};
-
-struct method_t {
- namespace_entry_t namespace_entry;
- symbol_t *symbol;
- method_type_t *type;
- method_parameter_t *parameters;
-
- statement_t *statement;
-};
-
-struct global_variable_t {
- namespace_entry_t namespace_entry;
- symbol_t *symbol;
- type_t *type;
-};
-
-struct namespace_t {
- namespace_entry_t *entries;
+struct translation_unit_t {
+ context_t context;
};
static inline