X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=0d13d79697cb334d108ee9f2423da6896a42eadb;hp=31ddfe16bfcc2304f1a3a592345bc182ee439a7c;hb=762750b4a3f4e0471993849c4bd12965f6b62356;hpb=7d79fea75fc664e54a5d5a2668a55f554296a845 diff --git a/src/parser.re b/src/parser.re index 31ddfe1..0d13d79 100644 --- a/src/parser.re +++ b/src/parser.re @@ -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;