%code top {
-#include "php_psi_stdinc.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# include "php_config.h"
+#endif
}
%code {
%type <struct psi_token **> impl_stmt
%destructor {psi_impl_stmt_free(&$$);} impl_stmt
%type <struct psi_token *> impl_type_token impl_type_restricted_token impl_type_extended_token callback_rval let_func_token set_func_token assert_stmt_token
-%destructor {psi_token_free(&$$);} impl_type_token impl_type_restricted_token impl_type_extended_token callback_rval let_func_token set_func_token assert_stmt_token
+%destructor {} impl_type_token impl_type_restricted_token impl_type_extended_token callback_rval let_func_token set_func_token assert_stmt_token
%type <struct psi_plist *> impl_args impl_stmts let_exps let_func_exps callback_arg_list callback_args set_exps set_func_exps free_exps
%destructor {psi_plist_free($$);} impl_args impl_stmts let_exps let_func_exps callback_arg_list callback_args set_exps set_func_exps free_exps
#if PSI_DEBUG_LEX
PSI_DEBUG_PRINT(P, "PSI: LEX index %4zu ", *index);
#endif
- if (psi_plist_get(tokens, (*index)++, &token)) {
+ if (psi_plist_get(tokens, (*index)++, &token) && token) {
#if PSI_DEBUG_LEX
PSI_DEBUG_DUMP(P, psi_token_dump, token);
#endif
psi_plist_get(tokens, last, &T);
if (T) {
+ size_t i = (last >= 5) ? last - 5 : 0;
+
P->error(PSI_DATA(P), T, PSI_WARNING, "PSI %s at col %u", msg, T->col);
+ while (i <= last || T->type != PSI_T_EOS) {
+ const char *pos;
+
+ if (!psi_plist_get(tokens, i++, &T)) {
+ break;
+ }
+
+ if (i < last + 1) {
+ pos = "preceding";
+ } else if (i > last + 1) {
+ pos = "following";
+ } else {
+ pos = "offending";
+ }
+
+ P->error(PSI_DATA(P), T, PSI_WARNING, "PSI %s token '%s' at col %u",
+ pos, T ? T->text->val : "<deleted>", T ? T->col : 0);
+ }
} else {
P->error(PSI_DATA(P), NULL, PSI_WARNING, "PSI %s", msg);
}