flush
[m6w6/ext-psi] / src / parser.re
index 831b218757c108e571c646ee05a17e4682b9514d..d5a0f8e0205824d32aaf0134341fb6d8e5c10f7c 100644 (file)
@@ -30,8 +30,8 @@ PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb err
        }
        memset(P, 0, sizeof(*P));
 
+       P->psi.file.fn = strdup(filename);
        P->fp = fp;
-       P->fn = strdup(filename);
        P->line = 1;
        P->error = error;
        P->flags = flags;
@@ -141,24 +141,12 @@ 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); \
+       } \
        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.
-
-*/
 token_t PSI_ParserScan(PSI_Parser *P)
 {
        for (;;) {
@@ -169,7 +157,7 @@ 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_];
@@ -179,7 +167,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                QUOTED_STRING = "\"" ([^\"])+ "\"";
                NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
 
-               "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
+               ("#"|"//") .* "\n" { ++P->line; continue;}
                "(" {RETURN(PSI_T_LPAREN);}
                ")" {RETURN(PSI_T_RPAREN);}
                ";" {RETURN(PSI_T_EOS);}
@@ -191,8 +179,11 @@ token_t PSI_ParserScan(PSI_Parser *P)
                "]" {RETURN(PSI_T_RBRACKET);}
                "=" {RETURN(PSI_T_EQUALS);}
                "$" {RETURN(PSI_T_DOLLAR);}
-               "*" {RETURN(PSI_T_POINTER);}
-               "&" {RETURN(PSI_T_REFERENCE);}
+               "*" {RETURN(PSI_T_ASTERISK);}
+               "&" {RETURN(PSI_T_AMPERSAND);}
+               "+" {RETURN(PSI_T_PLUS);}
+               "-" {RETURN(PSI_T_MINUS);}
+               "/" {RETURN(PSI_T_SLASH);}
                [\r\n] { ++P->line; continue; }
                [\t ]+ { continue; }
                'TRUE' {RETURN(PSI_T_TRUE);}
@@ -212,8 +203,10 @@ token_t PSI_ParserScan(PSI_Parser *P)
                'UINT32_T' {RETURN(PSI_T_UINT32);}
                'INT64_T' {RETURN(PSI_T_INT64);}
                'UINT64_T' {RETURN(PSI_T_UINT64);}
+               'UNSIGNED' {RETURN(PSI_T_UNSIGNED);}
                'STRING' {RETURN(PSI_T_STRING);}
                'ARRAY' {RETURN(PSI_T_ARRAY);}
+               'OBJECT' {RETURN(PSI_T_OBJECT);}
                'FUNCTION' {RETURN(PSI_T_FUNCTION);}
                'TYPEDEF' {RETURN(PSI_T_TYPEDEF);}
                'STRUCT' {RETURN(PSI_T_STRUCT);}
@@ -225,11 +218,14 @@ token_t PSI_ParserScan(PSI_Parser *P)
                'FREE' {RETURN(PSI_T_FREE);}
                '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);}
                '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);}