zval passthru
[m6w6/ext-psi] / src / parser.re
index d4a25d2a5592e901881d18a56022a59edda168b3..61c328d815bab5f210b772c806f6fc60b9b02736 100644 (file)
@@ -1,5 +1,8 @@
+#include <stddef.h>
 #include <stdio.h>
 #include <assert.h>
+#include <errno.h>
+#include <string.h>
 
 #include "parser.h"
 #include "parser_proc.h"
@@ -13,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;
        }
 
@@ -32,6 +33,7 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err
 
        P->psi.file.fn = strdup(filename);
        P->fp = fp;
+       P->col = 1;
        P->line = 1;
        P->error = error;
        P->flags = flags;
@@ -46,20 +48,6 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err
        return P;
 }
 
-void PSI_ParserSyntaxError(PSI_Parser *P, const char *fn, size_t ln, const char *msg, ...) {
-       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);
-
-       ++P->errors;
-}
-
 size_t PSI_ParserFill(PSI_Parser *P, size_t n)
 {
        if (P->flags & PSI_PARSER_DEBUG) {
@@ -142,14 +130,26 @@ 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)\n", P->num, (int) (P->cur-P->tok), P->tok, P->num == PSI_T_EOF); \
+               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)
 
+#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;
@@ -164,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" { ++P->line; continue;}
+               "/*" { goto comment; }
+               ("#"|"//") .* "\n" { NEWLINE(nextline); }
                "(" {RETURN(PSI_T_LPAREN);}
                ")" {RETURN(PSI_T_RPAREN);}
                ";" {RETURN(PSI_T_EOS);}
@@ -178,18 +180,25 @@ 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_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);}
+               '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);}
@@ -201,24 +210,34 @@ token_t PSI_ParserScan(PSI_Parser *P)
                '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);}
@@ -227,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;
 }