X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=0bca5b09aca87938a0645828ec222b70e1d1aca6;hp=31ddfe16bfcc2304f1a3a592345bc182ee439a7c;hb=6e8b5c090b44299f82f4e748d8bf6b8bc5b66414;hpb=7d79fea75fc664e54a5d5a2668a55f554296a845 diff --git a/src/parser.re b/src/parser.re index 31ddfe1..0bca5b0 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,9 +183,13 @@ 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'; + SIZE_T = 'size_t'; SINT8 = 'sint8'; UINT8 = 'uint8'; SINT16 = 'sint16'; @@ -195,15 +202,20 @@ token_t PSI_ParserScan(PSI_Parser *P) ARRAY = 'array'; FUNCTION = 'function'; TYPEDEF = 'typedef'; + STRUCT = 'struct'; + CONST = 'const'; LIB = 'lib'; LET = 'let'; SET = 'set'; - RET = 'ret'; + RETURN = 'return'; + FREE = 'free'; STRLEN = 'strlen'; STRVAL = 'strval'; INTVAL = 'intval'; FLOATVAL = 'floatval'; BOOLVAL = 'boolval'; + CALLOC = 'calloc'; + TO_ARRAY = 'to_array'; TO_STRING = 'to_string'; TO_INT = 'to_int'; TO_FLOAT = 'to_float'; @@ -218,6 +230,8 @@ token_t PSI_ParserScan(PSI_Parser *P) ":" {RETURN(PSI_T_COLON);} "{" {RETURN(PSI_T_LBRACE);} "}" {RETURN(PSI_T_RBRACE);} + "[" {RETURN(PSI_T_LBRACKET);} + "]" {RETURN(PSI_T_RBRACKET);} "=" {RETURN(PSI_T_EQUALS);} "$" {RETURN(PSI_T_DOLLAR);} "*" {RETURN(PSI_T_POINTER);} @@ -230,9 +244,13 @@ 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);} + SIZE_T {RETURN(PSI_T_SIZE_T);} SINT8 {RETURN(PSI_T_SINT8);} UINT8 {RETURN(PSI_T_UINT8);} SINT16 {RETURN(PSI_T_SINT16);} @@ -245,15 +263,20 @@ token_t PSI_ParserScan(PSI_Parser *P) ARRAY {RETURN(PSI_T_ARRAY);} FUNCTION {RETURN(PSI_T_FUNCTION);} TYPEDEF {RETURN(PSI_T_TYPEDEF);} + STRUCT {RETURN(PSI_T_STRUCT);} + 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);} FLOATVAL {RETURN(PSI_T_FLOATVAL);} BOOLVAL {RETURN(PSI_T_BOOLVAL);} + CALLOC {RETURN(PSI_T_CALLOC);} + TO_ARRAY {RETURN(PSI_T_TO_ARRAY);} TO_STRING {RETURN(PSI_T_TO_STRING);} TO_INT {RETURN(PSI_T_TO_INT);} TO_FLOAT {RETURN(PSI_T_TO_FLOAT);} @@ -262,7 +285,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;