X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser_proc_grammar.y;h=0694536636bd590c09d50c3e99410f533f92d3c7;hp=fc0b75210aad1c9bee15ec96aa19f11745804624;hb=0682ecb84dfe1de08b609c6c0ae641b06f3fa481;hpb=d2e0af1718294569a84c3c15616c74e4d55ea579 diff --git a/src/parser_proc_grammar.y b/src/parser_proc_grammar.y index fc0b752..0694536 100644 --- a/src/parser_proc_grammar.y +++ b/src/parser_proc_grammar.y @@ -1,4 +1,9 @@ %code top { +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif } %code { @@ -187,7 +192,6 @@ struct psi_parser; %token IIF "?" %token PRAGMA -%token PRAGMA_ONCE %token LINE %token ERROR %token WARNING @@ -209,7 +213,6 @@ struct psi_parser; %token UNION %token ENUM %token CONST -%token LIB %token STATIC %token CALLBACK %token FUNCTION @@ -279,11 +282,11 @@ struct psi_parser; %precedence BINARY %precedence UNARY -%type lib optional_name enum_name struct_name union_name -%destructor {psi_token_free(&$$);} lib optional_name enum_name struct_name union_name +%type optional_name enum_name struct_name union_name +%destructor {psi_token_free(&$$);} optional_name enum_name struct_name union_name -%type cpp_message_token cpp_include_token cpp_header_token cpp_no_arg_token cpp_name_arg_token cpp_exp_arg_token -%destructor {} cpp_message_token cpp_include_token cpp_header_token cpp_no_arg_token cpp_name_arg_token cpp_exp_arg_token +%type cpp_message_token cpp_include_token cpp_header_token cpp_no_arg_token cpp_name_arg_token cpp_exp_arg_token cpp_macro_decl_arg_token +%destructor {} cpp_message_token cpp_include_token cpp_header_token cpp_no_arg_token cpp_name_arg_token cpp_exp_arg_token cpp_macro_decl_arg_token %type name_token any_noeol_token binary_op_token unary_op_token %destructor {} name_token any_noeol_token binary_op_token unary_op_token @@ -385,7 +388,7 @@ struct psi_parser; %type impl_stmt %destructor {psi_impl_stmt_free(&$$);} impl_stmt %type 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 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 @@ -406,9 +409,9 @@ struct psi_parser; binary_op_token: PIPE | CARET | AMPERSAND | LSHIFT | RSHIFT | PLUS | MINUS | ASTERISK | SLASH | MODULO | RCHEVR | LCHEVR | CMP_GE | CMP_LE | OR | AND | CMP_EQ | CMP_NE ; unary_op_token: TILDE | NOT | PLUS | MINUS ; -name_token: NAME | FUNCTION | TEMP | FREE | SET | LET | CALLOC | CALLBACK | LIB | BOOL | STRING | MIXED | ARRAY | OBJECT | ERROR | WARNING | LINE | PRAGMA_ONCE | PRAGMA | AS | let_func_token | set_func_token; -any_noeol_token: BOOL | CHAR | SHORT | INT | SIGNED | UNSIGNED | LONG | FLOAT | DOUBLE | STRING | MIXED | ARRAY | OBJECT | CALLABLE | VOID | ZVAL | NULL | TRUE | FALSE | NAME | NSNAME | DOLLAR_NAME | NUMBER | QUOTED_STRING | QUOTED_CHAR | EOF | EOS | LPAREN | RPAREN | COMMA | COLON | LBRACE | RBRACE | LBRACKET | RBRACKET | EQUALS | HASH | PIPE | CARET | AMPERSAND | LSHIFT | RSHIFT | PLUS | MINUS | ASTERISK | SLASH | MODULO | LCHEVR | RCHEVR | CMP_GE | CMP_LE | OR | AND | CMP_EQ | CMP_NE | TILDE | NOT | PERIOD | BACKSLASH | ELLIPSIS | ERROR | WARNING | LINE | PRAGMA | PRAGMA_ONCE | IIF | IF | IFDEF | IFNDEF | ELSE | ELIF | ENDIF | DEFINE | DEFINED | UNDEF | INCLUDE | TYPEDEF | STRUCT | UNION | ENUM | CONST | LIB | STATIC | CALLBACK | FUNCTION | LET | SET | TEMP | FREE | RETURN | PRE_ASSERT | POST_ASSERT | BOOLVAL | INTVAL | STRVAL | PATHVAL | STRLEN | FLOATVAL | ARRVAL | OBJVAL | COUNT | CALLOC | TO_BOOL | TO_INT | TO_STRING | TO_FLOAT | TO_ARRAY | TO_OBJECT | COMMENT | CPP_HEADER | CPP_PASTE | CPP_INLINE | CPP_RESTRICT | CPP_EXTENSION | CPP_ASM | SIZEOF | VOLATILE | AS; -any_nobrace_token: BOOL | CHAR | SHORT | INT | SIGNED | UNSIGNED | LONG | FLOAT | DOUBLE | STRING | MIXED | ARRAY | OBJECT | CALLABLE | VOID | ZVAL | NULL | TRUE | FALSE | NAME | NSNAME | DOLLAR_NAME | NUMBER | QUOTED_STRING | QUOTED_CHAR | EOF | EOS | LPAREN | RPAREN | COMMA | COLON | LBRACKET | RBRACKET | EQUALS | HASH | PIPE | CARET | AMPERSAND | LSHIFT | RSHIFT | PLUS | MINUS | ASTERISK | SLASH | MODULO | LCHEVR | RCHEVR | CMP_GE | CMP_LE | OR | AND | CMP_EQ | CMP_NE | TILDE | NOT | PERIOD | BACKSLASH | ELLIPSIS | ERROR | WARNING | LINE | PRAGMA | PRAGMA_ONCE | IIF | IF | IFDEF | IFNDEF | ELSE | ELIF | ENDIF | DEFINE | DEFINED | UNDEF | INCLUDE | TYPEDEF | STRUCT | UNION | ENUM | CONST | LIB | STATIC | CALLBACK | FUNCTION | LET | SET | TEMP | FREE | RETURN | PRE_ASSERT | POST_ASSERT | BOOLVAL | INTVAL | STRVAL | PATHVAL | STRLEN | FLOATVAL | ARRVAL | OBJVAL | COUNT | CALLOC | TO_BOOL | TO_INT | TO_STRING | TO_FLOAT | TO_ARRAY | TO_OBJECT | COMMENT | CPP_HEADER | CPP_PASTE | CPP_INLINE | CPP_RESTRICT | CPP_EXTENSION | CPP_ASM | SIZEOF | VOLATILE | AS; +name_token: NAME | FUNCTION | TEMP | FREE | SET | LET | CALLOC | CALLBACK | BOOL | STRING | MIXED | ARRAY | OBJECT | ERROR | WARNING | LINE | PRAGMA | AS | let_func_token | set_func_token; +any_noeol_token: BOOL | CHAR | SHORT | INT | SIGNED | UNSIGNED | LONG | FLOAT | DOUBLE | STRING | MIXED | ARRAY | OBJECT | CALLABLE | VOID | ZVAL | NULL | TRUE | FALSE | NAME | NSNAME | DOLLAR_NAME | NUMBER | QUOTED_STRING | QUOTED_CHAR | EOF | EOS | LPAREN | RPAREN | COMMA | COLON | LBRACE | RBRACE | LBRACKET | RBRACKET | EQUALS | HASH | PIPE | CARET | AMPERSAND | LSHIFT | RSHIFT | PLUS | MINUS | ASTERISK | SLASH | MODULO | LCHEVR | RCHEVR | CMP_GE | CMP_LE | OR | AND | CMP_EQ | CMP_NE | TILDE | NOT | PERIOD | BACKSLASH | ELLIPSIS | ERROR | WARNING | LINE | PRAGMA | IIF | IF | IFDEF | IFNDEF | ELSE | ELIF | ENDIF | DEFINE | DEFINED | UNDEF | INCLUDE | TYPEDEF | STRUCT | UNION | ENUM | CONST | STATIC | CALLBACK | FUNCTION | LET | SET | TEMP | FREE | RETURN | PRE_ASSERT | POST_ASSERT | BOOLVAL | INTVAL | STRVAL | PATHVAL | STRLEN | FLOATVAL | ARRVAL | OBJVAL | COUNT | CALLOC | TO_BOOL | TO_INT | TO_STRING | TO_FLOAT | TO_ARRAY | TO_OBJECT | COMMENT | CPP_HEADER | CPP_PASTE | CPP_INLINE | CPP_RESTRICT | CPP_EXTENSION | CPP_ASM | SIZEOF | VOLATILE | AS; +any_nobrace_token: BOOL | CHAR | SHORT | INT | SIGNED | UNSIGNED | LONG | FLOAT | DOUBLE | STRING | MIXED | ARRAY | OBJECT | CALLABLE | VOID | ZVAL | NULL | TRUE | FALSE | NAME | NSNAME | DOLLAR_NAME | NUMBER | QUOTED_STRING | QUOTED_CHAR | EOF | EOS | LPAREN | RPAREN | COMMA | COLON | LBRACKET | RBRACKET | EQUALS | HASH | PIPE | CARET | AMPERSAND | LSHIFT | RSHIFT | PLUS | MINUS | ASTERISK | SLASH | MODULO | LCHEVR | RCHEVR | CMP_GE | CMP_LE | OR | AND | CMP_EQ | CMP_NE | TILDE | NOT | PERIOD | BACKSLASH | ELLIPSIS | ERROR | WARNING | LINE | PRAGMA | IIF | IF | IFDEF | IFNDEF | ELSE | ELIF | ENDIF | DEFINE | DEFINED | UNDEF | INCLUDE | TYPEDEF | STRUCT | UNION | ENUM | CONST | STATIC | CALLBACK | FUNCTION | LET | SET | TEMP | FREE | RETURN | PRE_ASSERT | POST_ASSERT | BOOLVAL | INTVAL | STRVAL | PATHVAL | STRLEN | FLOATVAL | ARRVAL | OBJVAL | COUNT | CALLOC | TO_BOOL | TO_INT | TO_STRING | TO_FLOAT | TO_ARRAY | TO_OBJECT | COMMENT | CPP_HEADER | CPP_PASTE | CPP_INLINE | CPP_RESTRICT | CPP_EXTENSION | CPP_ASM | SIZEOF | VOLATILE | AS; file: @@ -429,10 +432,6 @@ block: psi_cpp_exp_free(&$cpp); } } -| lib { - char *libname = strdup($lib->text->val); - P->file.libnames = psi_plist_add(P->file.libnames, &libname); -} | constant { psi_parser_proc_add_const(P, $constant); } @@ -465,12 +464,6 @@ block: } ; -lib: - LIB QUOTED_STRING EOS { - $lib = $QUOTED_STRING; -} -; - cpp: HASH EOL { $cpp = NULL; @@ -517,27 +510,28 @@ cpp_exp[exp]: $exp = psi_cpp_exp_init($cpp_name_arg_token->type, psi_token_copy($name_token)); $exp->token = psi_token_copy($cpp_name_arg_token); } -| DEFINE cpp_macro_decl { - $exp = psi_cpp_exp_init($DEFINE->type, $cpp_macro_decl); - $exp->token = psi_token_copy($DEFINE); +| cpp_macro_decl_arg_token cpp_macro_decl { + $exp = psi_cpp_exp_init($cpp_macro_decl_arg_token->type, $cpp_macro_decl); + $exp->token = psi_token_copy($cpp_macro_decl_arg_token); } | cpp_exp_arg_token cpp_macro_exp { $exp = psi_cpp_exp_init($cpp_exp_arg_token->type, $cpp_macro_exp); $exp->token = psi_token_copy($cpp_exp_arg_token); } -| PRAGMA_ONCE { - $exp = psi_cpp_exp_init($PRAGMA_ONCE->type, NULL); - $exp->token = psi_token_copy($PRAGMA_ONCE); -} | cpp_ignored_token cpp_macro_decl_tokens[tokens] { psi_plist_free($tokens); $exp = NULL; } ; +cpp_macro_decl_arg_token: + DEFINE +| PRAGMA + +; + cpp_ignored_token: LINE -| PRAGMA ; cpp_message_token: @@ -2291,7 +2285,7 @@ static int psi_parser_proc_lex(YYSTYPE *lvalp, struct psi_parser *P, struct psi_ #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 @@ -2324,11 +2318,22 @@ static void psi_parser_proc_error(struct psi_parser *P, struct psi_plist *tokens 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", - ilast+1?"following":"offending", T->text->val, T->col); + pos, T ? T->text->val : "", T ? T->col : 0); } } else { P->error(PSI_DATA(P), NULL, PSI_WARNING, "PSI %s", msg);