X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=61c328d815bab5f210b772c806f6fc60b9b02736;hp=906e8b940252ce1ad45db6a1795e4df69ef323df;hb=e8a409b21cb50f5931ab02ce6ab4f4406be94394;hpb=f1a387482a9270a34ae684109ad8be7c104148d6 diff --git a/src/parser.re b/src/parser.re index 906e8b9..61c328d 100644 --- a/src/parser.re +++ b/src/parser.re @@ -1,5 +1,8 @@ +#include #include #include +#include +#include #include "parser.h" #include "parser_proc.h" @@ -9,19 +12,17 @@ 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; - if (!P) { - P = malloc(sizeof(*P)); - } - memset(P, 0, sizeof(*P)); - fp = fopen(filename, "r"); if (!fp) { - perror(filename); + if (!(flags & PSI_PARSER_SILENT)) { + error(NULL, NULL, PSI_WARNING, "Could not open '%s' for reading: %s", + filename, strerror(errno)); + } return NULL; } @@ -30,9 +31,11 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, unsigned flags) } 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; P->proc = PSI_ParserProcAlloc(malloc); @@ -45,18 +48,6 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, unsigned flags) return P; } -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; - - va_start(argv, msg); - vfprintf(stderr, msg, argv); - va_end(argv); - } - ++P->errors; -} - size_t PSI_ParserFill(PSI_Parser *P, size_t n) { if (P->flags & PSI_PARSER_DEBUG) { @@ -138,27 +129,27 @@ void PSI_ParserFree(PSI_Parser **P) #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(label) \ + P->col = 1; \ + ++P->line; \ + goto label -*/ token_t PSI_ParserScan(PSI_Parser *P) { for (;;) { + ADDCOLS; + nextline: P->tok = P->cur; /*!re2c re2c:indent:top = 2; @@ -166,51 +157,19 @@ 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_]; W = [a-zA-Z0-9_]; NAME = [a-zA-Z_]W*; NSNAME = (NAME)? ("\\" NAME)+; + DOLLAR_NAME = '$' NAME; QUOTED_STRING = "\"" ([^\"])+ "\""; - TRUE = 'TRUE'; - FALSE = 'FALSE'; - NULL = 'NULL'; - MIXED = 'mixed'; - VOID = 'void'; - BOOL = 'bool'; - INT = 'int'; - FLOAT = 'float'; - DOUBLE = 'double'; - SINT8 = 'sint8'; - UINT8 = 'uint8'; - SINT16 = 'sint16'; - UINT16 = 'uint16'; - SINT32 = 'sint32'; - UINT32 = 'uint32'; - SINT64 = 'sint64'; - UINT64 = 'uint64'; - STRING = 'string'; - ARRAY = 'array'; - FUNCTION = 'function'; - TYPEDEF = 'typedef'; - LIB = 'lib'; - LET = 'let'; - SET = 'set'; - RET = 'ret'; - STRLEN = 'strlen'; - STRVAL = 'strval'; - INTVAL = 'intval'; - FLOATVAL = 'floatval'; - BOOLVAL = 'boolval'; - TO_STRING = 'to_string'; - TO_INT = 'to_int'; - TO_FLOAT = 'to_float'; - TO_BOOL = 'to_bool'; NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?; - "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);} + "/*" { goto comment; } + ("#"|"//") .* "\n" { NEWLINE(nextline); } "(" {RETURN(PSI_T_LPAREN);} ")" {RETURN(PSI_T_RPAREN);} ";" {RETURN(PSI_T_EOS);} @@ -218,50 +177,86 @@ 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);} - "&" {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(nextline); } [\t ]+ { continue; } - TRUE {RETURN(PSI_T_TRUE);} - FALSE {RETURN(PSI_T_FALSE);} - NULL {RETURN(PSI_T_NULL);} - MIXED {RETURN(PSI_T_MIXED);} - VOID {RETURN(PSI_T_VOID);} - BOOL {RETURN(PSI_T_BOOL);} - INT {RETURN(PSI_T_INT);} - FLOAT {RETURN(PSI_T_FLOAT);} - DOUBLE {RETURN(PSI_T_DOUBLE);} - SINT8 {RETURN(PSI_T_SINT8);} - UINT8 {RETURN(PSI_T_UINT8);} - SINT16 {RETURN(PSI_T_SINT16);} - UINT16 {RETURN(PSI_T_UINT16);} - SINT32 {RETURN(PSI_T_SINT32);} - UINT32 {RETURN(PSI_T_UINT32);} - SINT64 {RETURN(PSI_T_SINT64);} - UINT64 {RETURN(PSI_T_UINT64);} - STRING {RETURN(PSI_T_STRING);} - ARRAY {RETURN(PSI_T_ARRAY);} - FUNCTION {RETURN(PSI_T_FUNCTION);} - TYPEDEF {RETURN(PSI_T_TYPEDEF);} - LIB {RETURN(PSI_T_LIB);} - LET {RETURN(PSI_T_LET);} - SET {RETURN(PSI_T_SET);} - RET {RETURN(PSI_T_RET);} - 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);} - TO_STRING {RETURN(PSI_T_TO_STRING);} - TO_INT {RETURN(PSI_T_TO_INT);} - TO_FLOAT {RETURN(PSI_T_TO_FLOAT);} - TO_BOOL {RETURN(PSI_T_TO_BOOL);} + 'TRUE' {RETURN(PSI_T_TRUE);} + 'FALSE' {RETURN(PSI_T_FALSE);} + 'NULL' {RETURN(PSI_T_NULL);} + 'MIXED' {RETURN(PSI_T_MIXED);} + 'CALLABLE' {RETURN(PSI_T_CALLABLE);} + '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);} + 'INT8_T' {RETURN(PSI_T_INT8);} + 'UINT8_T' {RETURN(PSI_T_UINT8);} + 'INT16_T' {RETURN(PSI_T_INT16);} + 'UINT16_T' {RETURN(PSI_T_UINT16);} + 'INT32_T' {RETURN(PSI_T_INT32);} + 'UINT32_T' {RETURN(PSI_T_UINT32);} + 'INT64_T' {RETURN(PSI_T_INT64);} + 'UINT64_T' {RETURN(PSI_T_UINT64);} + 'UNSIGNED' {RETURN(PSI_T_UNSIGNED);} + 'SIGNED' {RETURN(PSI_T_SIGNED);} + 'STRING' {RETURN(PSI_T_STRING);} + 'ARRAY' {RETURN(PSI_T_ARRAY);} + 'OBJECT' {RETURN(PSI_T_OBJECT);} + 'CALLBACK' {RETURN(PSI_T_CALLBACK);} + 'FUNCTION' {RETURN(PSI_T_FUNCTION);} + 'TYPEDEF' {RETURN(PSI_T_TYPEDEF);} + 'STRUCT' {RETURN(PSI_T_STRUCT);} + 'UNION' {RETURN(PSI_T_UNION);} + 'ENUM' {RETURN(PSI_T_ENUM);} + 'CONST' {RETURN(PSI_T_CONST);} + 'LIB' {RETURN(PSI_T_LIB);} + 'LET' {RETURN(PSI_T_LET);} + '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);} + 'ZVAL' {RETURN(PSI_T_ZVAL);} + '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);} + 'TO_FLOAT' {RETURN(PSI_T_TO_FLOAT);} + 'TO_BOOL' {RETURN(PSI_T_TO_BOOL);} NUMBER {RETURN(PSI_T_NUMBER);} NAME {RETURN(PSI_T_NAME);} NSNAME {RETURN(PSI_T_NSNAME);} + DOLLAR_NAME {RETURN(PSI_T_DOLLAR_NAME);} QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);} + [^] {break;} + */ + + comment: + P->tok = P->cur; + /*!re2c + "\n" { NEWLINE(comment); } + "*" "/" { continue; } + [^] { goto comment; } */ } return -1;