X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=src%2Fparser_def.h;h=293fdb8462d6ae50f146c1a56fb9d2f434da44e6;hb=acb84297d3ceeb57c97e0ac4da1881eba6aee18e;hp=1910ebfe9f6e6dab828ecd1d59e9075d2d9eee1e;hpb=991b10eeadb51b0b3309f140391ecf0b4c1e1859;p=m6w6%2Fext-psi diff --git a/src/parser_def.h b/src/parser_def.h index 1910ebf..293fdb8 100644 --- a/src/parser_def.h +++ b/src/parser_def.h @@ -27,6 +27,9 @@ #define CONCAT1(x,y) CONCAT2(x,y) #define COUNTED(x) CONCAT1(parse_ ##x## _, __LINE__) +#define TOKEN_PREFIX PSI_T +#define TOKEN_STRUCT struct psi_token * + #ifdef GENERATE # define DEF(dn, dv) dn dv # define PASS(nt, rule) nt ::= rule. @@ -38,6 +41,8 @@ # define TYPED(t, name) t(name) # define TOKEN_TYPE(token, type_) %type token {type_} # define TOKEN_DTOR(token, dtor) %destructor token {dtor} +# define T(token) token +# define TOKEN_CLASS(type, tokens) DEF(%token_class, type##_token tokens .) #else # ifndef TEST # include "parser.h" @@ -60,10 +65,12 @@ # define TOKEN_TYPE_NAME(token) token##_parse_t # define TOKEN_TYPE(token, type) typedef type TOKEN_TYPE_NAME(token); # define TOKEN_DTOR(token, dtor) +# define T(token) CONCAT1(TOKEN_PREFIX, _ ##token ), +# define TOKEN_CLASS(type, tokens) static token_t type##_token[] = { tokens 0 }; #endif -DEF(%token_prefix, PSI_T_) -DEF(%token_type, {struct psi_token *}) +DEF(%token_prefix, CONCAT1(TOKEN_PREFIX,_)) +DEF(%token_type, {TOKEN_STRUCT}) DEF(%token_destructor, {free($$);}) DEF(%default_destructor, {(void)P;}) DEF(%extra_argument, {struct psi_parser *P}) @@ -78,32 +85,29 @@ DEF(%syntax_error, { } }) -DEF(%token_class, const_type_token BOOL INT FLOAT STRING.) -DEF(%token_class, decl_type_token FLOAT DOUBLE INT8 UINT8 INT16 UINT16 INT32 UINT32 INT64 UINT64 NAME.) -DEF(%token_class, impl_def_val_token NULL NUMBER TRUE FALSE QUOTED_STRING.) -DEF(%token_class, number_token NUMBER NSNAME.) -DEF(%token_class, num_exp_binary_op_token PIPE CARET AMPERSAND LSHIFT RSHIFT PLUS MINUS ASTERISK SLASH MODULO.) -DEF(%token_class, num_exp_unary_op_token TILDE NOT PLUS MINUS.) -DEF(%token_class, let_func_token ZVAL OBJVAL ARRVAL PATHVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL COUNT.) -DEF(%token_class, set_func_token TO_OBJECT TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL ZVAL VOID.) -DEF(%token_class, impl_type_token VOID MIXED BOOL INT FLOAT STRING ARRAY OBJECT CALLABLE.) +TOKEN_CLASS(const_type, T(BOOL) T(INT) T(FLOAT) T(STRING)) +TOKEN_CLASS(decl_type, T(FLOAT) T(DOUBLE) T(INT8) T(UINT8) T(INT16) T(UINT16) T(INT32) T(UINT32) T(INT64) T(UINT64) T(NAME)) +TOKEN_CLASS(impl_def_val, T(NULL) T(NUMBER) T(TRUE) T(FALSE) T(QUOTED_STRING)) +TOKEN_CLASS(number, T(NUMBER) T(NSNAME)) +TOKEN_CLASS(binary_op, T(PIPE) T(CARET) T(AMPERSAND) T(LSHIFT) T(RSHIFT) T(PLUS) T(MINUS) T(ASTERISK) T(SLASH) T(MODULO) T(RCHEVR) T(LCHEVR) T(CMP_GE) T(CMP_LE) T(OR) T(AND) T(CMP_EQ) T(CMP_NE)) +TOKEN_CLASS(unary_op, T(TILDE) T(NOT) T(PLUS) T(MINUS)) +TOKEN_CLASS(let_func, T(ZVAL) T(OBJVAL) T(ARRVAL) T(PATHVAL) T(STRLEN) T(STRVAL) T(FLOATVAL) T(INTVAL) T(BOOLVAL) T(COUNT)) +TOKEN_CLASS(set_func, T(TO_OBJECT) T(TO_ARRAY) T(TO_STRING) T(TO_INT) T(TO_FLOAT) T(TO_BOOL) T(ZVAL) T(VOID)) +TOKEN_CLASS(impl_type, T(VOID) T(MIXED) T(BOOL) T(INT) T(FLOAT) T(STRING) T(ARRAY) T(OBJECT) T(CALLABLE)) +TOKEN_CLASS(assert_stmt, T(PRE_ASSERT) T(POST_ASSERT)) DEF(%nonassoc, NAME.) DEF(%right, NOT TILDE.) +DEF(%left, AND OR.) DEF(%left, PIPE.) DEF(%left, CARET.) DEF(%left, AMPERSAND.) +DEF(%left, CMP_EQ CMP_NE.) +DEF(%left, LCHEVR CMP_LE RCHEVR CMP_GE.) DEF(%left, LSHIFT RSHIFT.) DEF(%left, PLUS MINUS.) DEF(%left, ASTERISK SLASH MODULO.) -/* -DEF(%left, ASTERISK SLASH MODULO.) -DEF(%left, PLUS MINUS.) -DEF(%left, LSHIFT RSHIFT.) -DEF(%left, AMPERSAND.) -DEF(%left, CARET.) -DEF(%left, PIPE.) -*/ + DEF(%fallback, NAME TEMP FREE SET LET RETURN CALLOC CALLBACK ZVAL LIB STRING COUNT.) TOKEN_TYPE(decl_enum, struct psi_decl_enum *) @@ -195,6 +199,8 @@ TOKEN_TYPE(let_exp, struct psi_let_exp*) TOKEN_DTOR(let_exp, psi_let_exp_free(&$$);) TOKEN_TYPE(let_exps, struct psi_plist*) TOKEN_DTOR(let_exps, psi_plist_free($$);) +TOKEN_TYPE(assert_stmt, struct psi_assert_stmt*) +TOKEN_DTOR(assert_stmt, psi_assert_stmt_free(&$$);) TOKEN_TYPE(set_stmt, struct psi_set_stmt*) TOKEN_DTOR(set_stmt, psi_set_stmt_free(&$$);) TOKEN_TYPE(set_exp, struct psi_set_exp*) @@ -1408,6 +1414,14 @@ PARSE_TYPED(impl_stmt, i, i = (struct psi_token**) s; } +/* + * impl_stmt: assert_stmt + */ +PARSE_TYPED(impl_stmt, i, + TYPED(assert_stmt, s)) { + i = (struct psi_token **) s; +} + /* * impl_stmt: free_stmt */ @@ -1426,7 +1440,7 @@ PARSE_TYPED(number, exp, } /* - * num_exp: decl_var + * number: decl_var */ PARSE_TYPED(number, exp, TYPED(decl_var, var)) { @@ -1435,7 +1449,7 @@ PARSE_TYPED(number, exp, } /* - * num_exp: num_exp + * num_exp: number */ PARSE_TYPED(num_exp, exp, TYPED(number, num)) { @@ -1455,21 +1469,21 @@ PARSE_TYPED(num_exp, exp, } /* - * num_exp: num_exp num_exp_binary_op_token num_exp + * num_exp: num_exp binary_op_token num_exp */ PARSE_TYPED(num_exp, exp, TYPED(num_exp, lhs_) - NAMED(num_exp_binary_op_token, OP) + NAMED(binary_op_token, OP) TYPED(num_exp, rhs_)) { exp = psi_num_exp_init_binary(OP->type, lhs_, rhs_); exp->token = OP; } /* - * num_exp: num_exp_unary_op_token num_exp + * num_exp: unary_op_token num_exp */ PARSE_TYPED(num_exp, exp, - NAMED(num_exp_unary_op_token, OP) + NAMED(unary_op_token, OP) TYPED(num_exp, exp_)) { exp = psi_num_exp_init_unary(OP->type, exp_); exp->token = OP; @@ -1869,6 +1883,17 @@ PARSE_TYPED(free_exp, call, call->token = F; } +/* + * assert_stmt: assert_stmt_token num_exp ; + */ +PARSE_TYPED(assert_stmt, ass, + NAMED(assert_stmt_token, T) + TYPED(num_exp, exp) + TOKEN(EOS)) { + ass = psi_assert_stmt_init(T->type, exp); + ass->token = T; +} + /* * reference: */