flush
[m6w6/ext-psi] / src / parser.re
index 31ddfe16bfcc2304f1a3a592345bc182ee439a7c..0d13d79697cb334d108ee9f2423da6896a42eadb 100644 (file)
@@ -9,7 +9,7 @@ void PSI_ParserProcFree(void*, void(*)(void*));
 void PSI_ParserProc(void *, token_t, PSI_Token *, PSI_Parser *);
 void PSI_ParserProcTrace(FILE *, const char*);
 
-PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, unsigned flags)
+PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb error, unsigned flags)
 {
        FILE *fp;
 
@@ -33,6 +33,7 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, unsigned flags)
        P->fp = fp;
        P->fn = strdup(filename);
        P->line = 1;
+       P->error = error;
        P->flags = flags;
 
        P->proc = PSI_ParserProcAlloc(malloc);
@@ -46,14 +47,16 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, unsigned flags)
 }
 
 void PSI_ParserSyntaxError(PSI_Parser *P, const char *fn, size_t ln, const char *msg, ...) {
-       fprintf(stderr, "WARNING: Syntax error on line %zu in '%s'%s", ln, fn, msg ? ": ": "\n");
-       if (msg) {
-               va_list argv;
+       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);
 
-               va_start(argv, msg);
-               vfprintf(stderr, msg, argv);
-               va_end(argv);
-       }
        ++P->errors;
 }
 
@@ -180,7 +183,10 @@ token_t PSI_ParserScan(PSI_Parser *P)
                MIXED = 'mixed';
                VOID = 'void';
                BOOL = 'bool';
+               CHAR = 'char';
+               SHORT = 'short';
                INT = 'int';
+               LONG = 'long';
                FLOAT = 'float';
                DOUBLE = 'double';
                SINT8 = 'sint8';
@@ -195,10 +201,12 @@ token_t PSI_ParserScan(PSI_Parser *P)
                ARRAY = 'array';
                FUNCTION = 'function';
                TYPEDEF = 'typedef';
+               CONST = 'const';
                LIB = 'lib';
                LET = 'let';
                SET = 'set';
-               RET = 'ret';
+               RETURN = 'return';
+               FREE = 'free';
                STRLEN = 'strlen';
                STRVAL = 'strval';
                INTVAL = 'intval';
@@ -230,7 +238,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);}
                SINT8 {RETURN(PSI_T_SINT8);}
@@ -245,10 +256,12 @@ token_t PSI_ParserScan(PSI_Parser *P)
                ARRAY {RETURN(PSI_T_ARRAY);}
                FUNCTION {RETURN(PSI_T_FUNCTION);}
                TYPEDEF {RETURN(PSI_T_TYPEDEF);}
+               CONST {RETURN(PSI_T_CONST);}
                LIB {RETURN(PSI_T_LIB);}
                LET {RETURN(PSI_T_LET);}
                SET {RETURN(PSI_T_SET);}
-               RET {RETURN(PSI_T_RET);}
+               RETURN {RETURN(PSI_T_RETURN);}
+               FREE {RETURN(PSI_T_FREE);}
                STRLEN {RETURN(PSI_T_STRLEN);}
                STRVAL {RETURN(PSI_T_STRVAL);}
                INTVAL {RETURN(PSI_T_INTVAL);}
@@ -262,7 +275,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                NAME {RETURN(PSI_T_NAME);}
                NSNAME {RETURN(PSI_T_NSNAME);}
                QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}
-               [^] {break;} 
+               [^] {break;}
                */
        }
        return -1;