better errors
[m6w6/ext-psi] / src / parser.re
index 0782b8fe3a09d88e841e7e4a39f16ff9beda71b8..3375a0b5b88e2c9408ca063157ce05476ece365c 100644 (file)
@@ -30,8 +30,9 @@ 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);
        P->fp = fp;
-       P->fn = strdup(filename);
+       P->col = 1;
        P->line = 1;
        P->error = error;
        P->flags = flags;
@@ -46,20 +47,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,29 +126,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" : \
+<UNKNOWN>
+
 #define RETURN(t) do { \
        P->num = t; \
+       if (P->flags & PSI_PARSER_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); \
+       } \
        return t; \
 } while(1)
 
-/*             DIGIT = [0-9]
-               DIGITS = DIGIT+
-               DECIMALS = (+|-)? DIGIT* "."
-               digits ::= digits DIGIT.
-               decimals ::= digits DOT digits.
-               decimals ::= DOT digits.
-               decimals ::= digits DOT.
-               number ::= digits.
-               number ::= PLUS digits.
-               number ::= MINUS digits.
-               number ::= decimals.
-               number ::= MINUS decimals.
-               number ::= PLUS decimals.
-
-*/
+#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;
@@ -169,7 +227,7 @@ 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(-1); }";
+               re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(PSI_T_EOF); }";
                re2c:yyfill:parameter = 0;
 
                B = [^a-zA-Z0-9_];
@@ -179,7 +237,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                QUOTED_STRING = "\"" ([^\"])+ "\"";
                NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
 
-               "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
+               ("#"|"//") .* "\n" { NEWLINE; }
                "(" {RETURN(PSI_T_LPAREN);}
                ")" {RETURN(PSI_T_RPAREN);}
                ";" {RETURN(PSI_T_EOS);}
@@ -191,9 +249,13 @@ token_t PSI_ParserScan(PSI_Parser *P)
                "]" {RETURN(PSI_T_RBRACKET);}
                "=" {RETURN(PSI_T_EQUALS);}
                "$" {RETURN(PSI_T_DOLLAR);}
-               "*" {RETURN(PSI_T_POINTER);}
-               "&" {RETURN(PSI_T_REFERENCE);}
-               [\r\n] { ++P->line; continue; }
+               "*" {RETURN(PSI_T_ASTERISK);}
+               "&" {RETURN(PSI_T_AMPERSAND);}
+               "+" {RETURN(PSI_T_PLUS);}
+               "-" {RETURN(PSI_T_MINUS);}
+               "/" {RETURN(PSI_T_SLASH);}
+               "..." {RETURN(PSI_T_ELLIPSIS);}
+               [\r\n] { NEWLINE; }
                [\t ]+ { continue; }
                'TRUE' {RETURN(PSI_T_TRUE);}
                'FALSE' {RETURN(PSI_T_FALSE);}
@@ -204,16 +266,18 @@ token_t PSI_ParserScan(PSI_Parser *P)
                'INT' {RETURN(PSI_T_INT);}
                'FLOAT' {RETURN(PSI_T_FLOAT);}
                'DOUBLE' {RETURN(PSI_T_DOUBLE);}
-               'INT8_T' {RETURN(PSI_T_SINT8);}
+               'INT8_T' {RETURN(PSI_T_INT8);}
                'UINT8_T' {RETURN(PSI_T_UINT8);}
-               'INT16_T' {RETURN(PSI_T_SINT16);}
+               'INT16_T' {RETURN(PSI_T_INT16);}
                'UINT16_T' {RETURN(PSI_T_UINT16);}
-               'INT32_T' {RETURN(PSI_T_SINT32);}
+               'INT32_T' {RETURN(PSI_T_INT32);}
                'UINT32_T' {RETURN(PSI_T_UINT32);}
-               'INT64_T' {RETURN(PSI_T_SINT64);}
+               'INT64_T' {RETURN(PSI_T_INT64);}
                'UINT64_T' {RETURN(PSI_T_UINT64);}
+               'UNSIGNED' {RETURN(PSI_T_UNSIGNED);}
                '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);}
@@ -223,13 +287,17 @@ token_t PSI_ParserScan(PSI_Parser *P)
                '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);}
                'INTVAL' {RETURN(PSI_T_INTVAL);}
                'FLOATVAL' {RETURN(PSI_T_FLOATVAL);}
                'BOOLVAL' {RETURN(PSI_T_BOOLVAL);}
                'ARRVAL' {RETURN(PSI_T_ARRVAL);}
+               'OBJVAL' {RETURN(PSI_T_OBJVAL);}
                'CALLOC' {RETURN(PSI_T_CALLOC);}
+               'TO_OBJECT' {RETURN(PSI_T_TO_OBJECT);}
                'TO_ARRAY' {RETURN(PSI_T_TO_ARRAY);}
                'TO_STRING' {RETURN(PSI_T_TO_STRING);}
                'TO_INT' {RETURN(PSI_T_TO_INT);}