X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=50d15aadd86d0b9ae7dfb35a1b445277afdbf554;hp=d5a0f8e0205824d32aaf0134341fb6d8e5c10f7c;hb=6a459a08a40a2c243b0211ceb0cb263d29302627;hpb=2421d323be79e4a811a4197914330a8c0124b130 diff --git a/src/parser.re b/src/parser.re index d5a0f8e..50d15aa 100644 --- a/src/parser.re +++ b/src/parser.re @@ -1,5 +1,8 @@ +#include #include #include +#include +#include #include "parser.h" #include "parser_proc.h" @@ -13,15 +16,11 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err { FILE *fp; - if (!P) { - P = malloc(sizeof(*P)); - } - memset(P, 0, sizeof(*P)); - fp = fopen(filename, "r"); if (!fp) { - perror(filename); + error(NULL, PSI_WARNING, "Could not open '%s' for reading: %s", + filename, strerror(errno)); return NULL; } @@ -32,6 +31,7 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err P->psi.file.fn = strdup(filename); P->fp = fp; + P->col = 1; P->line = 1; P->error = error; P->flags = flags; @@ -46,20 +46,6 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err return P; } -void PSI_ParserSyntaxError(PSI_Parser *P, const char *fn, size_t ln, const char *msg, ...) { - char buf[0x1000] = {0}; - va_list argv; - - va_start(argv, msg); - vsnprintf(buf, 0x1000-1, msg, argv); - va_end(argv); - - P->error(PSI_WARNING, "PSI syntax error on line %zu in '%s'%s%s", - ln, fn, msg ? ": ": "", buf); - - ++P->errors; -} - size_t PSI_ParserFill(PSI_Parser *P, size_t n) { if (P->flags & PSI_PARSER_DEBUG) { @@ -139,17 +125,100 @@ void PSI_ParserFree(PSI_Parser **P) # error BSIZE must be greater than YYMAXFILL #endif +#define PSI_T(n) \ +(n) == PSI_T_NAME ? "NAME" : \ +(n) == PSI_T_PLUS ? "PLUS" : \ +(n) == PSI_T_MINUS ? "MINUS" : \ +(n) == PSI_T_SLASH ? "SLASH" : \ +(n) == PSI_T_ASTERISK ? "ASTERISK" : \ +(n) == PSI_T_TEMP ? "TEMP" : \ +(n) == PSI_T_FREE ? "FREE" : \ +(n) == PSI_T_SET ? "SET" : \ +(n) == PSI_T_LET ? "LET" : \ +(n) == PSI_T_RETURN ? "RETURN" : \ +(n) == PSI_T_LIB ? "LIB" : \ +(n) == PSI_T_INT ? "INT" : \ +(n) == PSI_T_UNSIGNED ? "UNSIGNED" : \ +(n) == PSI_T_EOF ? "EOF" : \ +(n) == PSI_T_QUOTED_STRING ? "QUOTED_STRING" : \ +(n) == PSI_T_EOS ? "EOS" : \ +(n) == PSI_T_STRUCT ? "STRUCT" : \ +(n) == PSI_T_LBRACE ? "LBRACE" : \ +(n) == PSI_T_RBRACE ? "RBRACE" : \ +(n) == PSI_T_COLON ? "COLON" : \ +(n) == PSI_T_LPAREN ? "LPAREN" : \ +(n) == PSI_T_NUMBER ? "NUMBER" : \ +(n) == PSI_T_RPAREN ? "RPAREN" : \ +(n) == PSI_T_BOOL ? "BOOL" : \ +(n) == PSI_T_FLOAT ? "FLOAT" : \ +(n) == PSI_T_STRING ? "STRING" : \ +(n) == PSI_T_CONST ? "CONST" : \ +(n) == PSI_T_NSNAME ? "NSNAME" : \ +(n) == PSI_T_EQUALS ? "EQUALS" : \ +(n) == PSI_T_TYPEDEF ? "TYPEDEF" : \ +(n) == PSI_T_VOID ? "VOID" : \ +(n) == PSI_T_LBRACKET ? "LBRACKET" : \ +(n) == PSI_T_RBRACKET ? "RBRACKET" : \ +(n) == PSI_T_COMMA ? "COMMA" : \ +(n) == PSI_T_ELLIPSIS ? "ELLIPSIS" : \ +(n) == PSI_T_DOUBLE ? "DOUBLE" : \ +(n) == PSI_T_INT8 ? "INT8" : \ +(n) == PSI_T_UINT8 ? "UINT8" : \ +(n) == PSI_T_INT16 ? "INT16" : \ +(n) == PSI_T_UINT16 ? "UINT16" : \ +(n) == PSI_T_INT32 ? "INT32" : \ +(n) == PSI_T_UINT32 ? "UINT32" : \ +(n) == PSI_T_INT64 ? "INT64" : \ +(n) == PSI_T_UINT64 ? "UINT64" : \ +(n) == PSI_T_FUNCTION ? "FUNCTION" : \ +(n) == PSI_T_NULL ? "NULL" : \ +(n) == PSI_T_TRUE ? "TRUE" : \ +(n) == PSI_T_FALSE ? "FALSE" : \ +(n) == PSI_T_DOLLAR ? "DOLLAR" : \ +(n) == PSI_T_CALLOC ? "CALLOC" : \ +(n) == PSI_T_OBJVAL ? "OBJVAL" : \ +(n) == PSI_T_ARRVAL ? "ARRVAL" : \ +(n) == PSI_T_PATHVAL ? "PATHVAL" : \ +(n) == PSI_T_STRLEN ? "STRLEN" : \ +(n) == PSI_T_STRVAL ? "STRVAL" : \ +(n) == PSI_T_FLOATVAL ? "FLOATVAL" : \ +(n) == PSI_T_INTVAL ? "INTVAL" : \ +(n) == PSI_T_BOOLVAL ? "BOOLVAL" : \ +(n) == PSI_T_TO_OBJECT ? "TO_OBJECT" : \ +(n) == PSI_T_TO_ARRAY ? "TO_ARRAY" : \ +(n) == PSI_T_TO_STRING ? "TO_STRING" : \ +(n) == PSI_T_TO_INT ? "TO_INT" : \ +(n) == PSI_T_TO_FLOAT ? "TO_FLOAT" : \ +(n) == PSI_T_TO_BOOL ? "TO_BOOL" : \ +(n) == PSI_T_MIXED ? "MIXED" : \ +(n) == PSI_T_ARRAY ? "ARRAY" : \ +(n) == PSI_T_OBJECT ? "OBJECT" : \ +(n) == PSI_T_AMPERSAND ? "AMPERSAND" : \ + + #define RETURN(t) do { \ P->num = t; \ if (P->flags & PSI_PARSER_DEBUG) { \ - fprintf(stderr, "PSI> TOKEN: %d %.*s (EOF=%d)\n", P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF); \ + 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); \ } \ return t; \ } while(1) +#define ADDCOLS \ + P->col += P->cur - P->tok + +#define NEWLINE \ + P->col = 1; \ + ++P->line; \ + goto nextline + token_t PSI_ParserScan(PSI_Parser *P) { for (;;) { + ADDCOLS; + nextline: P->tok = P->cur; /*!re2c re2c:indent:top = 2; @@ -167,7 +236,7 @@ token_t PSI_ParserScan(PSI_Parser *P) QUOTED_STRING = "\"" ([^\"])+ "\""; NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?; - ("#"|"//") .* "\n" { ++P->line; continue;} + ("#"|"//") .* "\n" { NEWLINE; } "(" {RETURN(PSI_T_LPAREN);} ")" {RETURN(PSI_T_RPAREN);} ";" {RETURN(PSI_T_EOS);} @@ -184,7 +253,8 @@ token_t PSI_ParserScan(PSI_Parser *P) "+" {RETURN(PSI_T_PLUS);} "-" {RETURN(PSI_T_MINUS);} "/" {RETURN(PSI_T_SLASH);} - [\r\n] { ++P->line; continue; } + "..." {RETURN(PSI_T_ELLIPSIS);} + [\r\n] { NEWLINE; } [\t ]+ { continue; } 'TRUE' {RETURN(PSI_T_TRUE);} 'FALSE' {RETURN(PSI_T_FALSE);} @@ -192,7 +262,10 @@ token_t PSI_ParserScan(PSI_Parser *P) 'MIXED' {RETURN(PSI_T_MIXED);} 'VOID' {RETURN(PSI_T_VOID);} 'BOOL' {RETURN(PSI_T_BOOL);} + 'CHAR' {RETURN(PSI_T_CHAR);} + 'SHORT' {RETURN(PSI_T_SHORT);} 'INT' {RETURN(PSI_T_INT);} + 'LONG' {RETURN(PSI_T_LONG);} 'FLOAT' {RETURN(PSI_T_FLOAT);} 'DOUBLE' {RETURN(PSI_T_DOUBLE);} 'INT8_T' {RETURN(PSI_T_INT8);} @@ -204,18 +277,21 @@ token_t PSI_ParserScan(PSI_Parser *P) 'INT64_T' {RETURN(PSI_T_INT64);} 'UINT64_T' {RETURN(PSI_T_UINT64);} 'UNSIGNED' {RETURN(PSI_T_UNSIGNED);} + 'SIGNED' {RETURN(PSI_T_SIGNED);} 'STRING' {RETURN(PSI_T_STRING);} 'ARRAY' {RETURN(PSI_T_ARRAY);} 'OBJECT' {RETURN(PSI_T_OBJECT);} 'FUNCTION' {RETURN(PSI_T_FUNCTION);} 'TYPEDEF' {RETURN(PSI_T_TYPEDEF);} 'STRUCT' {RETURN(PSI_T_STRUCT);} + 'ENUM' {RETURN(PSI_T_ENUM);} 'CONST' {RETURN(PSI_T_CONST);} 'LIB' {RETURN(PSI_T_LIB);} 'LET' {RETURN(PSI_T_LET);} 'SET' {RETURN(PSI_T_SET);} 'RETURN' {RETURN(PSI_T_RETURN);} 'FREE' {RETURN(PSI_T_FREE);} + 'TEMP' {RETURN(PSI_T_TEMP);} 'STRLEN' {RETURN(PSI_T_STRLEN);} 'STRVAL' {RETURN(PSI_T_STRVAL);} 'PATHVAL' {RETURN(PSI_T_PATHVAL);}