#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.
# 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"
# 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})
}
})
-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 *)
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*)
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
*/
}
/*
- * num_exp: decl_var
+ * number: decl_var
*/
PARSE_TYPED(number, exp,
TYPED(decl_var, var)) {
}
/*
- * num_exp: num_exp
+ * num_exp: number
*/
PARSE_TYPED(num_exp, exp,
TYPED(number, num)) {
}
/*
- * 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;
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: <empty>
*/