X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=df2d102716025b9df8dcab16634eec88d51a333a;hp=b64eacc5a533d403f703758095c7038e3629266d;hb=f15288e185e65bcdfde87c217fb6bd7ff12eb653;hpb=7df12c88a4e14611a2585d6e7c994c59e8d7485a diff --git a/src/parser.re b/src/parser.re index b64eacc..df2d102 100644 --- a/src/parser.re +++ b/src/parser.re @@ -4,10 +4,10 @@ #include "parser.h" -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*); +void *psi_parser_proc_init(void); +void psi_parser_proc_free(void **parser_proc); +void psi_parser_proc_parse(void *parser_proc, token_t r, struct psi_token *token, struct psi_parser *parser); +void psi_parser_proc_trace(FILE *out, char *prefix); struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, unsigned flags) { @@ -20,10 +20,10 @@ struct psi_parser *psi_parser_init(struct psi_parser *P, psi_error_cb error, uns P->col = 1; P->line = 1; - P->proc = psi_parser_proc_Alloc(malloc); + P->proc = psi_parser_proc_init(); if (flags & PSI_DEBUG) { - psi_parser_proc_Trace(stderr, "PSI> "); + psi_parser_proc_trace(stderr, "PSI> "); } return P; @@ -86,7 +86,7 @@ bool psi_parser_open_string(struct psi_parser *P, const char *string, size_t len static ssize_t psi_parser_fill(struct psi_parser *P, size_t n) { - PSI_DEBUG_PRINT(P, "PSI> Fill: n=%zu (input.type=%d)\n", n, P->input.type); + PSI_DEBUG_PRINT(P, "PSI< Fill: n=%zu (input.type=%d)\n", n, P->input.type); /* init if n==0 */ if (!n) { @@ -109,7 +109,7 @@ static ssize_t psi_parser_fill(struct psi_parser *P, size_t n) break; } - PSI_DEBUG_PRINT(P, "PSI> Fill: cur=%p lim=%p eof=%p\n", P->cur, P->lim, P->eof); + PSI_DEBUG_PRINT(P, "PSI< Fill: cur=%p lim=%p eof=%p\n", P->cur, P->lim, P->eof); } switch (P->input.type) { @@ -137,14 +137,14 @@ static ssize_t psi_parser_fill(struct psi_parser *P, size_t n) if (didread < available) { P->eof = P->lim; } - PSI_DEBUG_PRINT(P, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n", + PSI_DEBUG_PRINT(P, "PSI< Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n", consumed, reserved, available, didread); } #endif break; } - PSI_DEBUG_PRINT(P, "PSI> Fill: avail=%td\n", P->lim - P->cur); + PSI_DEBUG_PRINT(P, "PSI< Fill: avail=%td\n", P->lim - P->cur); return P->lim - P->cur; } @@ -152,15 +152,15 @@ static ssize_t psi_parser_fill(struct psi_parser *P, size_t n) void psi_parser_parse(struct psi_parser *P, struct psi_token *T) { if (T) { - psi_parser_proc_(P->proc, T->type, T, P); + psi_parser_proc_parse(P->proc, T->type, T, P); } else { - psi_parser_proc_(P->proc, 0, NULL, P); + psi_parser_proc_parse(P->proc, 0, NULL, P); } } void psi_parser_dtor(struct psi_parser *P) { - psi_parser_proc_Free(P->proc, free); + psi_parser_proc_free(&P->proc); switch (P->input.type) { case PSI_PARSE_FILE: @@ -204,7 +204,7 @@ void psi_parser_free(struct psi_parser **P) #define RETURN(t) do { \ P->num = t; \ - PSI_DEBUG_PRINT(P, "PSI> TOKEN: %d %.*s (EOF=%d %s:%u:%u)\n", \ + PSI_DEBUG_PRINT(P, "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->file.fn, P->line, P->col); \ return t; \ @@ -255,8 +255,15 @@ token_t psi_parser_scan(struct psi_parser *P) "}" {RETURN(PSI_T_RBRACE);} "[" {RETURN(PSI_T_LBRACKET);} "]" {RETURN(PSI_T_RBRACKET);} + "!=" {RETURN(PSI_T_CMP_NE);} + "==" {RETURN(PSI_T_CMP_EQ);} + "&&" {RETURN(PSI_T_AND);} + "||" {RETURN(PSI_T_OR);} "=" {RETURN(PSI_T_EQUALS);} "*" {RETURN(PSI_T_ASTERISK);} + "~" {RETURN(PSI_T_TILDE);} + "!" {RETURN(PSI_T_NOT);} + "%" {RETURN(PSI_T_MODULO);} "&" {RETURN(PSI_T_AMPERSAND);} "+" {RETURN(PSI_T_PLUS);} "-" {RETURN(PSI_T_MINUS);} @@ -265,6 +272,10 @@ token_t psi_parser_scan(struct psi_parser *P) "^" {RETURN(PSI_T_CARET);} "<<" {RETURN(PSI_T_LSHIFT);} ">>" {RETURN(PSI_T_RSHIFT);} + "<=" {RETURN(PSI_T_CMP_LE);} + ">=" {RETURN(PSI_T_CMP_GE);} + "<" {RETURN(PSI_T_LCHEVR);} + ">" {RETURN(PSI_T_RCHEVR);} "..." {RETURN(PSI_T_ELLIPSIS);} [\r\n] { NEWLINE(nextline); } [\t ]+ { continue; } @@ -305,6 +316,8 @@ token_t psi_parser_scan(struct psi_parser *P) 'LIB' {RETURN(PSI_T_LIB);} 'LET' {RETURN(PSI_T_LET);} 'SET' {RETURN(PSI_T_SET);} + 'PRE_ASSERT' {RETURN(PSI_T_PRE_ASSERT);} + 'POST_ASSERT' {RETURN(PSI_T_POST_ASSERT);} 'RETURN' {RETURN(PSI_T_RETURN);} 'FREE' {RETURN(PSI_T_FREE);} 'TEMP' {RETURN(PSI_T_TEMP);}