flush
[m6w6/ext-psi] / src / parser.re
index d0daecb92e2a7163a7f35c8b076df8756dfe7457..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_];
@@ -177,47 +165,9 @@ token_t PSI_ParserScan(PSI_Parser *P)
                NAME = [a-zA-Z_]W*;
                NSNAME = (NAME)? ("\\" NAME)+;
                QUOTED_STRING = "\"" ([^\"])+ "\"";
-               TRUE = 'TRUE';
-               FALSE = 'FALSE';
-               NULL = 'NULL';
-               MIXED = 'mixed';
-               VOID = 'void';
-               BOOL = 'bool';
-               CHAR = 'char';
-               SHORT = 'short';
-               INT = 'int';
-               LONG = 'long';
-               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';
-               RETURN = 'return';
-               FREE = 'free';
-               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);}
+               ("#"|"//") .* "\n" { ++P->line; continue;}
                "(" {RETURN(PSI_T_LPAREN);}
                ")" {RETURN(PSI_T_RPAREN);}
                ";" {RETURN(PSI_T_EOS);}
@@ -225,50 +175,62 @@ 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);}
+               "*" {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);}
-               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);}
-               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);}
-               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);}
-               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);}
-               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);}
+               '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);}
+               '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);}
+               '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);}
+               '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);}
+               '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);}
+               '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);}