X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser.re;h=d2edd5ea15cd69de7ddadbe6b6322162b82c3c2e;hb=9bcb1df0786a8193d65949c857baaba2f4296e84;hp=10279ed7674f52f618a92f0eb8601b6fcb0c926c;hpb=8ea12c5ca367010b2d5024e68849e06af9300d61;p=m6w6%2Fext-psi diff --git a/src/parser.re b/src/parser.re index 10279ed..d2edd5e 100644 --- a/src/parser.re +++ b/src/parser.re @@ -1,25 +1,21 @@ -#include -#include +#include "php_psi_stdinc.h" #include -#include -#include #include "parser.h" -#include "parser_proc.h" -void *PSI_ParserProcAlloc(void*(unsigned long)); -void PSI_ParserProcFree(void*, void(*)(void*)); -void PSI_ParserProc(void *, token_t, PSI_Token *, PSI_Parser *); -void PSI_ParserProcTrace(FILE *, const char*); +void *psi_parser_proc_Alloc(void*(unsigned long)); +void psi_parser_proc_Free(void*, void(*)(void*)); +void psi_parser_proc_(void *, token_t, struct psi_token *, struct psi_parser *); +void psi_parser_proc_Trace(FILE *, const char*); -PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb error, unsigned flags) +struct psi_parser *psi_parser_init(struct psi_parser *P, const char *filename, psi_error_cb error, unsigned flags) { FILE *fp; fp = fopen(filename, "r"); if (!fp) { - if (!(flags & PSI_PARSER_SILENT)) { + if (!(flags & PSI_SILENT)) { error(NULL, NULL, PSI_WARNING, "Could not open '%s' for reading: %s", filename, strerror(errno)); } @@ -31,26 +27,25 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err } memset(P, 0, sizeof(*P)); - P->psi.file.fn = strdup(filename); + psi_data_ctor_with_dtors(PSI_DATA(P), error, flags); + P->file.fn = strdup(filename); P->fp = fp; P->col = 1; P->line = 1; - P->error = error; - P->flags = flags; - P->proc = PSI_ParserProcAlloc(malloc); + P->proc = psi_parser_proc_Alloc(malloc); - if (flags & PSI_PARSER_DEBUG) { - PSI_ParserProcTrace(stderr, "PSI> "); + if (flags & PSI_DEBUG) { + psi_parser_proc_Trace(stderr, "PSI> "); } - PSI_ParserFill(P, 0); + psi_parser_fill(P, 0); return P; } -size_t PSI_ParserFill(PSI_Parser *P, size_t n) +ssize_t psi_parser_fill(struct psi_parser *P, size_t n) { - if (P->flags & PSI_PARSER_DEBUG) { + if (P->flags & PSI_DEBUG) { fprintf(stderr, "PSI> Fill: n=%zu\n", n); } if (!n) { @@ -78,43 +73,43 @@ size_t PSI_ParserFill(PSI_Parser *P, size_t n) P->eof = P->lim; } - if (P->flags & PSI_PARSER_DEBUG) { + if (P->flags & PSI_DEBUG) { fprintf(stderr, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n", consumed, reserved, available, didread); } } - if (P->flags & PSI_PARSER_DEBUG) { - fprintf(stderr, "PSI> Fill: avail=%zu\n", P->lim - P->cur); + if (P->flags & PSI_DEBUG) { + fprintf(stderr, "PSI> Fill: avail=%td\n", P->lim - P->cur); } return P->lim - P->cur; } -void PSI_ParserParse(PSI_Parser *P, PSI_Token *T) +void psi_parser_parse(struct psi_parser *P, struct psi_token *T) { if (T) { - PSI_ParserProc(P->proc, T->type, T, P); + psi_parser_proc_(P->proc, T->type, T, P); } else { - PSI_ParserProc(P->proc, 0, NULL, P); + psi_parser_proc_(P->proc, 0, NULL, P); } } -void PSI_ParserDtor(PSI_Parser *P) +void psi_parser_dtor(struct psi_parser *P) { - PSI_ParserProcFree(P->proc, free); + psi_parser_proc_Free(P->proc, free); if (P->fp) { fclose(P->fp); } - PSI_DataDtor((PSI_Data *) P); + psi_data_dtor(PSI_DATA(P)); memset(P, 0, sizeof(*P)); } -void PSI_ParserFree(PSI_Parser **P) +void psi_parser_free(struct psi_parser **P) { if (*P) { - PSI_ParserDtor(*P); + psi_parser_dtor(*P); free(*P); *P = NULL; } @@ -129,10 +124,10 @@ void PSI_ParserFree(PSI_Parser **P) #define RETURN(t) do { \ P->num = t; \ - if (P->flags & PSI_PARSER_DEBUG) { \ + if (P->flags & PSI_DEBUG) { \ fprintf(stderr, "PSI> TOKEN: %d %.*s (EOF=%d %s:%u:%u)\n", \ P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF, \ - P->psi.file.fn, P->line, P->col); \ + P->file.fn, P->line, P->col); \ } \ return t; \ } while(1) @@ -145,7 +140,7 @@ void PSI_ParserFree(PSI_Parser **P) ++P->line; \ goto label -token_t PSI_ParserScan(PSI_Parser *P) +token_t psi_parser_scan(struct psi_parser *P) { for (;;) { ADDCOLS; @@ -157,14 +152,14 @@ token_t PSI_ParserScan(PSI_Parser *P) re2c:define:YYCURSOR = P->cur; re2c:define:YYLIMIT = P->lim; re2c:define:YYMARKER = P->mrk; - re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(PSI_T_EOF); }"; + re2c:define:YYFILL = "{ if (!psi_parser_fill(P,@@)) RETURN(PSI_T_EOF); }"; re2c:yyfill:parameter = 0; B = [^a-zA-Z0-9_]; W = [a-zA-Z0-9_]; NAME = [a-zA-Z_]W*; NSNAME = (NAME)? ("\\" NAME)+; - DOLLAR_NAME = '$' NAME; + DOLLAR_NAME = '$' W+; QUOTED_STRING = "\"" ([^\"])+ "\""; NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?; @@ -215,6 +210,7 @@ token_t PSI_ParserScan(PSI_Parser *P) 'ARRAY' {RETURN(PSI_T_ARRAY);} 'OBJECT' {RETURN(PSI_T_OBJECT);} 'CALLBACK' {RETURN(PSI_T_CALLBACK);} + 'STATIC' {RETURN(PSI_T_STATIC);} 'FUNCTION' {RETURN(PSI_T_FUNCTION);} 'TYPEDEF' {RETURN(PSI_T_TYPEDEF);} 'STRUCT' {RETURN(PSI_T_STRUCT);} @@ -236,6 +232,7 @@ token_t PSI_ParserScan(PSI_Parser *P) 'ARRVAL' {RETURN(PSI_T_ARRVAL);} 'OBJVAL' {RETURN(PSI_T_OBJVAL);} 'ZVAL' {RETURN(PSI_T_ZVAL);} + 'COUNT' {RETURN(PSI_T_COUNT);} 'CALLOC' {RETURN(PSI_T_CALLOC);} 'TO_OBJECT' {RETURN(PSI_T_TO_OBJECT);} 'TO_ARRAY' {RETURN(PSI_T_TO_ARRAY);}