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;
P->fp = fp;
P->fn = strdup(filename);
P->line = 1;
+ P->error = error;
P->flags = flags;
P->proc = PSI_ParserProcAlloc(malloc);
}
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;
}
MIXED = 'mixed';
VOID = 'void';
BOOL = 'bool';
+ CHAR = 'char';
+ SHORT = 'short';
INT = 'int';
+ LONG = 'long';
FLOAT = 'float';
DOUBLE = 'double';
SINT8 = 'sint8';
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';
FLOATVAL = 'floatval';
BOOLVAL = 'boolval';
+ CALLOC = 'calloc';
+ TO_ARRAY = 'to_array';
TO_STRING = 'to_string';
TO_INT = 'to_int';
TO_FLOAT = 'to_float';
":" {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);}
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);}
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);}
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);}
NAME {RETURN(PSI_T_NAME);}
NSNAME {RETURN(PSI_T_NSNAME);}
QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}
- [^] {break;}
+ [^] {break;}
*/
}
return -1;