+TOKEN_TYPE(let_exp, let_val*)
+TOKEN_DTOR(let_exp, free_let_val($$);)
+
+TOKEN_TYPE(let_callback, let_callback*)
+TOKEN_DTOR(let_callback, free_let_callback($$);)
+
+/*
+ * let_val: NULL
+ */
+PARSE_TYPED(let_val, val,
+ TOKEN(NULL)) {
+ val = init_let_val(PSI_LET_NULL, NULL);
+}
+/*
+ * let_val: &NULL
+ */
+PARSE_TYPED(let_val, val,
+ TOKEN(AMPERSAND)
+ TOKEN(NULL)) {
+ val = init_let_val(PSI_LET_NULL, NULL);
+ val->is_reference = 1;
+}
+/*
+ * let_val: callback
+ */
+PARSE_TYPED(let_val, val,
+ TYPED(let_callback, cb)) {
+ val = init_let_val(PSI_LET_CALLBACK, cb);
+}
+/*
+ * let_val: calloc
+ */
+PARSE_TYPED(let_val, val,
+ TYPED(let_calloc, ca)) {
+ val = init_let_val(PSI_LET_CALLOC, ca);
+}
+/*
+ * let_val: &calloc
+ */
+PARSE_TYPED(let_val, val,
+ TOKEN(AMPERSAND)
+ TYPED(let_calloc, ca)) {
+ val = init_let_val(PSI_LET_CALLOC, ca);
+ val->is_reference = 1;
+}
+/*
+ * let_val: func
+ */
+PARSE_TYPED(let_val, val,
+ TYPED(let_func, fn)) {
+ val = init_let_val_ex(NULL, PSI_LET_FUNC, fn);
+}
+/*
+ * let_val: &func
+ */
+PARSE_TYPED(let_val, val,
+ TOKEN(AMPERSAND)
+ TYPED(let_func, fn)) {
+ val = init_let_val_ex(NULL, PSI_LET_FUNC, fn);
+ val->is_reference = 1;
+}
+/*
+ * let_val: 1234
+ */
+PARSE_TYPED(let_val, val,
+ TYPED(num_exp, exp)) {
+ val = init_let_val_ex(NULL, PSI_LET_NUMEXP, exp);
+}
+/*
+ * let_val: &1234
+ */
+PARSE_TYPED(let_val, val,
+ TOKEN(AMPERSAND)
+ TYPED(num_exp, exp)) {
+ val = init_let_val_ex(NULL, PSI_LET_NUMEXP, exp);
+ val->is_reference = 1;
+}
+
+/*
+ * let_exp: var = val
+ */
+PARSE_TYPED(let_exp, exp,
+ TYPED(decl_var, var_)
+ TOKEN(EQUALS)
+ TYPED(let_val, val)) {
+ exp = val;
+ exp->var = var_;
+}
+
+/*
+ * let_stmt: LET exp ;
+ */