X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser.re;h=61c328d815bab5f210b772c806f6fc60b9b02736;hp=0922ba1b0f23f6ceb3debb4b9ffbe8c058aa77ae;hb=e8a409b21cb50f5931ab02ce6ab4f4406be94394;hpb=7e4b0ccdd2123647b6fff8065c0abc61be3fb44d diff --git a/src/parser.re b/src/parser.re index 0922ba1..61c328d 100644 --- a/src/parser.re +++ b/src/parser.re @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "parser.h" #include "parser_proc.h" @@ -14,15 +16,13 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err { 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; } @@ -127,77 +127,6 @@ void PSI_ParserFree(PSI_Parser **P) # error BSIZE must be greater than YYMAXFILL #endif -#define PSI_T(n) \ -(n) == PSI_T_NAME ? "NAME" : \ -(n) == PSI_T_PLUS ? "PLUS" : \ -(n) == PSI_T_MINUS ? "MINUS" : \ -(n) == PSI_T_SLASH ? "SLASH" : \ -(n) == PSI_T_ASTERISK ? "ASTERISK" : \ -(n) == PSI_T_TEMP ? "TEMP" : \ -(n) == PSI_T_FREE ? "FREE" : \ -(n) == PSI_T_SET ? "SET" : \ -(n) == PSI_T_LET ? "LET" : \ -(n) == PSI_T_RETURN ? "RETURN" : \ -(n) == PSI_T_LIB ? "LIB" : \ -(n) == PSI_T_INT ? "INT" : \ -(n) == PSI_T_UNSIGNED ? "UNSIGNED" : \ -(n) == PSI_T_EOF ? "EOF" : \ -(n) == PSI_T_QUOTED_STRING ? "QUOTED_STRING" : \ -(n) == PSI_T_EOS ? "EOS" : \ -(n) == PSI_T_STRUCT ? "STRUCT" : \ -(n) == PSI_T_LBRACE ? "LBRACE" : \ -(n) == PSI_T_RBRACE ? "RBRACE" : \ -(n) == PSI_T_COLON ? "COLON" : \ -(n) == PSI_T_LPAREN ? "LPAREN" : \ -(n) == PSI_T_NUMBER ? "NUMBER" : \ -(n) == PSI_T_RPAREN ? "RPAREN" : \ -(n) == PSI_T_BOOL ? "BOOL" : \ -(n) == PSI_T_FLOAT ? "FLOAT" : \ -(n) == PSI_T_STRING ? "STRING" : \ -(n) == PSI_T_CONST ? "CONST" : \ -(n) == PSI_T_NSNAME ? "NSNAME" : \ -(n) == PSI_T_EQUALS ? "EQUALS" : \ -(n) == PSI_T_TYPEDEF ? "TYPEDEF" : \ -(n) == PSI_T_VOID ? "VOID" : \ -(n) == PSI_T_LBRACKET ? "LBRACKET" : \ -(n) == PSI_T_RBRACKET ? "RBRACKET" : \ -(n) == PSI_T_COMMA ? "COMMA" : \ -(n) == PSI_T_ELLIPSIS ? "ELLIPSIS" : \ -(n) == PSI_T_DOUBLE ? "DOUBLE" : \ -(n) == PSI_T_INT8 ? "INT8" : \ -(n) == PSI_T_UINT8 ? "UINT8" : \ -(n) == PSI_T_INT16 ? "INT16" : \ -(n) == PSI_T_UINT16 ? "UINT16" : \ -(n) == PSI_T_INT32 ? "INT32" : \ -(n) == PSI_T_UINT32 ? "UINT32" : \ -(n) == PSI_T_INT64 ? "INT64" : \ -(n) == PSI_T_UINT64 ? "UINT64" : \ -(n) == PSI_T_FUNCTION ? "FUNCTION" : \ -(n) == PSI_T_NULL ? "NULL" : \ -(n) == PSI_T_TRUE ? "TRUE" : \ -(n) == PSI_T_FALSE ? "FALSE" : \ -(n) == PSI_T_DOLLAR ? "DOLLAR" : \ -(n) == PSI_T_CALLOC ? "CALLOC" : \ -(n) == PSI_T_OBJVAL ? "OBJVAL" : \ -(n) == PSI_T_ARRVAL ? "ARRVAL" : \ -(n) == PSI_T_PATHVAL ? "PATHVAL" : \ -(n) == PSI_T_STRLEN ? "STRLEN" : \ -(n) == PSI_T_STRVAL ? "STRVAL" : \ -(n) == PSI_T_FLOATVAL ? "FLOATVAL" : \ -(n) == PSI_T_INTVAL ? "INTVAL" : \ -(n) == PSI_T_BOOLVAL ? "BOOLVAL" : \ -(n) == PSI_T_TO_OBJECT ? "TO_OBJECT" : \ -(n) == PSI_T_TO_ARRAY ? "TO_ARRAY" : \ -(n) == PSI_T_TO_STRING ? "TO_STRING" : \ -(n) == PSI_T_TO_INT ? "TO_INT" : \ -(n) == PSI_T_TO_FLOAT ? "TO_FLOAT" : \ -(n) == PSI_T_TO_BOOL ? "TO_BOOL" : \ -(n) == PSI_T_MIXED ? "MIXED" : \ -(n) == PSI_T_ARRAY ? "ARRAY" : \ -(n) == PSI_T_OBJECT ? "OBJECT" : \ -(n) == PSI_T_AMPERSAND ? "AMPERSAND" : \ - - #define RETURN(t) do { \ P->num = t; \ if (P->flags & PSI_PARSER_DEBUG) { \ @@ -211,10 +140,10 @@ void PSI_ParserFree(PSI_Parser **P) #define ADDCOLS \ P->col += P->cur - P->tok -#define NEWLINE \ +#define NEWLINE(label) \ P->col = 1; \ ++P->line; \ - goto nextline + goto label token_t PSI_ParserScan(PSI_Parser *P) { @@ -235,10 +164,12 @@ token_t PSI_ParserScan(PSI_Parser *P) W = [a-zA-Z0-9_]; NAME = [a-zA-Z_]W*; NSNAME = (NAME)? ("\\" NAME)+; + DOLLAR_NAME = '$' NAME; QUOTED_STRING = "\"" ([^\"])+ "\""; NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?; - ("#"|"//") .* "\n" { NEWLINE; } + "/*" { goto comment; } + ("#"|"//") .* "\n" { NEWLINE(nextline); } "(" {RETURN(PSI_T_LPAREN);} ")" {RETURN(PSI_T_RPAREN);} ";" {RETURN(PSI_T_EOS);} @@ -249,19 +180,19 @@ token_t PSI_ParserScan(PSI_Parser *P) "[" {RETURN(PSI_T_LBRACKET);} "]" {RETURN(PSI_T_RBRACKET);} "=" {RETURN(PSI_T_EQUALS);} - "$" {RETURN(PSI_T_DOLLAR);} "*" {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; } + [\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);} + 'CALLABLE' {RETURN(PSI_T_CALLABLE);} 'VOID' {RETURN(PSI_T_VOID);} 'BOOL' {RETURN(PSI_T_BOOL);} 'CHAR' {RETURN(PSI_T_CHAR);} @@ -283,9 +214,12 @@ token_t PSI_ParserScan(PSI_Parser *P) '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);} @@ -301,6 +235,7 @@ token_t PSI_ParserScan(PSI_Parser *P) '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);} @@ -311,9 +246,18 @@ token_t PSI_ParserScan(PSI_Parser *P) 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; }