- QUOTED_STRING = "\"" ([^\"])+ "\"";
- NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
-
- ("#"|"//") .* "\n" { NEWLINE; }
- "(" {RETURN(PSI_T_LPAREN);}
- ")" {RETURN(PSI_T_RPAREN);}
- ";" {RETURN(PSI_T_EOS);}
- "," {RETURN(PSI_T_COMMA);}
- ":" {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_ASTERISK);}
- "&" {RETURN(PSI_T_AMPERSAND);}
- "+" {RETURN(PSI_T_PLUS);}
- "-" {RETURN(PSI_T_MINUS);}
- "/" {RETURN(PSI_T_SLASH);}
- "..." {RETURN(PSI_T_ELLIPSIS);}
- [\r\n] { NEWLINE; }
- [\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);}
- '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);}
- '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);}
- '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);}
- '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);}
- QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}
- [^] {break;}
+ DOLLAR_NAME = '$' W+;
+ CPP_HEADER = "<" [-._/a-zA-Z0-9]+ ">";
+ CPP_ATTRIBUTE = "__attribute__" SP* "((";
+
+ DEC_CONST = [1-9] [0-9]*;
+ OCT_CONST = "0" [0-7]*;
+ HEX_CONST = '0x' [0-9a-fA-F]+;
+ INT_CONST = (DEC_CONST | OCT_CONST | HEX_CONST);
+
+ FLT_HEX_CONST = HEX_CONST ("." [0-9a-fA-F]*)? 'p' [+-]? [0-9]+;
+ FLT_DEC_NUM = "0" | DEC_CONST;
+ FLT_DEC_CONST = (FLT_DEC_NUM ("." [0-9]*)? 'e' [+-]? [0-9]+) | (FLT_DEC_NUM "." [0-9]*) | ("." [0-9]+);
+ FLT_CONST = (FLT_DEC_CONST | FLT_HEX_CONST);
+
+ [+-]? INT_CONST { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT; goto start; }
+ [+-]? INT_CONST / 'u' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_U; cur += 1; goto start; }
+ [+-]? INT_CONST / 'l' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_L; cur += 1; goto start; }
+ [+-]? INT_CONST / ('lu' | 'ul') { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_UL; cur += 2; goto start; }
+ [+-]? INT_CONST / ('llu' | 'ull') { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_ULL; cur += 3; goto start; }
+
+ [+-]? FLT_CONST { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT; goto start; }
+ [+-]? FLT_CONST / 'f' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_F; cur += 1; goto start; }
+ [+-]? FLT_CONST / 'l' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_L; cur += 1; goto start; }
+ [+-]? FLT_CONST / 'df' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DF; cur += 2; goto start; }
+ [+-]? FLT_CONST / 'dd' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DD; cur += 2; goto start; }
+ [+-]? FLT_CONST / 'dl' { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DL; cur += 2; goto start; }
+
+ "'" { escaped = false; tok += 1; goto character; }
+ "\"" { escaped = false; tok += 1; goto string; }
+ "u8" / "\"" { char_width = 1; }
+ "u" / ['"] { char_width = 2; }
+ "U" / ['"] { char_width = 4; }
+ "L" / ['"] { char_width = SIZEOF_WCHAR_T/8; }
+
+ "/*" { goto comment; }
+ "//" { goto comment_sl; }
+
+ "##" { NEWTOKEN(PSI_T_CPP_PASTE); goto start; }
+ "#" { NEWTOKEN(PSI_T_HASH); goto start; }
+ "(" { NEWTOKEN(PSI_T_LPAREN); goto start; }
+ ")" { NEWTOKEN(PSI_T_RPAREN); goto start; }
+ ";" { NEWTOKEN(PSI_T_EOS); goto start; }
+ "," { NEWTOKEN(PSI_T_COMMA); goto start; }
+ ":" { NEWTOKEN(PSI_T_COLON); goto start; }
+ "{" { NEWTOKEN(PSI_T_LBRACE); goto start; }
+ "}" { NEWTOKEN(PSI_T_RBRACE); goto start; }
+ "[" { NEWTOKEN(PSI_T_LBRACKET); goto start; }
+ "]" { NEWTOKEN(PSI_T_RBRACKET); goto start; }
+ "!=" { NEWTOKEN(PSI_T_CMP_NE); goto start; }
+ "==" { NEWTOKEN(PSI_T_CMP_EQ); goto start; }
+ "&&" { NEWTOKEN(PSI_T_AND); goto start; }
+ "||" { NEWTOKEN(PSI_T_OR); goto start; }
+ "=" { NEWTOKEN(PSI_T_EQUALS); goto start; }
+ "*" { NEWTOKEN(PSI_T_ASTERISK); goto start; }
+ "~" { NEWTOKEN(PSI_T_TILDE); goto start; }
+ "!" { NEWTOKEN(PSI_T_NOT); goto start; }
+ "%" { NEWTOKEN(PSI_T_MODULO); goto start; }
+ "&" { NEWTOKEN(PSI_T_AMPERSAND); goto start; }
+ "+" { NEWTOKEN(PSI_T_PLUS); goto start; }
+ "-" { NEWTOKEN(PSI_T_MINUS); goto start; }
+ "/" { NEWTOKEN(PSI_T_SLASH); goto start; }
+ "\\" { NEWTOKEN(PSI_T_BSLASH); goto start; }
+ "|" { NEWTOKEN(PSI_T_PIPE); goto start; }
+ "^" { NEWTOKEN(PSI_T_CARET); goto start; }
+ "<<" { NEWTOKEN(PSI_T_LSHIFT); goto start; }
+ ">>" { NEWTOKEN(PSI_T_RSHIFT); goto start; }
+ "<=" { NEWTOKEN(PSI_T_CMP_LE); goto start; }
+ ">=" { NEWTOKEN(PSI_T_CMP_GE); goto start; }
+ "<" { NEWTOKEN(PSI_T_LCHEVR); goto start; }
+ ">" { NEWTOKEN(PSI_T_RCHEVR); goto start; }
+ "." { NEWTOKEN(PSI_T_PERIOD); goto start; }
+ "..." { NEWTOKEN(PSI_T_ELLIPSIS); goto start; }
+ "?" { NEWTOKEN(PSI_T_IIF); goto start; }
+ "pragma" { NEWTOKEN(PSI_T_PRAGMA); goto start; }
+ "pragma" W+ "once" { NEWTOKEN(PSI_T_PRAGMA_ONCE); goto start; }
+ "__restrict" { NEWTOKEN(PSI_T_CPP_RESTRICT); goto start; }
+ "__extension__" { NEWTOKEN(PSI_T_CPP_EXTENSION); goto start; }
+ "__asm__" { NEWTOKEN(PSI_T_CPP_ASM); goto start; }
+ "line" { NEWTOKEN(PSI_T_LINE); goto start; }
+ "typedef" { NEWTOKEN(PSI_T_TYPEDEF); goto start; }
+ "struct" { NEWTOKEN(PSI_T_STRUCT); goto start; }
+ "union" { NEWTOKEN(PSI_T_UNION); goto start; }
+ "enum" { NEWTOKEN(PSI_T_ENUM); goto start; }
+ "const" { NEWTOKEN(PSI_T_CONST); goto start; }
+ "void" { NEWTOKEN(PSI_T_VOID); goto start; }
+ "bool" { NEWTOKEN(PSI_T_BOOL); goto start; }
+ "char" { NEWTOKEN(PSI_T_CHAR); goto start; }
+ "short" { NEWTOKEN(PSI_T_SHORT); goto start; }
+ "int" { NEWTOKEN(PSI_T_INT); goto start; }
+ "long" { NEWTOKEN(PSI_T_LONG); goto start; }
+ "float" { NEWTOKEN(PSI_T_FLOAT); goto start; }
+ "double" { NEWTOKEN(PSI_T_DOUBLE); goto start; }
+ "int8_t" { NEWTOKEN(PSI_T_INT8); goto start; }
+ "uint8_t" { NEWTOKEN(PSI_T_UINT8); goto start; }
+ "int16_t" { NEWTOKEN(PSI_T_INT16); goto start; }
+ "uint16_t" { NEWTOKEN(PSI_T_UINT16); goto start; }
+ "int32_t" { NEWTOKEN(PSI_T_INT32); goto start; }
+ "uint32_t" { NEWTOKEN(PSI_T_UINT32); goto start; }
+ "int64_t" { NEWTOKEN(PSI_T_INT64); goto start; }
+ "uint64_t" { NEWTOKEN(PSI_T_UINT64); goto start; }
+ "unsigned" { NEWTOKEN(PSI_T_UNSIGNED); goto start; }
+ "signed" { NEWTOKEN(PSI_T_SIGNED); goto start; }
+ 'IF' { NEWTOKEN(PSI_T_IF); goto start; }
+ 'IFDEF' { NEWTOKEN(PSI_T_IFDEF); goto start; }
+ 'IFNDEF' { NEWTOKEN(PSI_T_IFNDEF); goto start; }
+ 'ELSE' { NEWTOKEN(PSI_T_ELSE); goto start; }
+ 'ELIF' { NEWTOKEN(PSI_T_ELIF); goto start; }
+ 'ENDIF' { NEWTOKEN(PSI_T_ENDIF); goto start; }
+ 'DEFINE' { NEWTOKEN(PSI_T_DEFINE); goto start; }
+ 'DEFINED' { NEWTOKEN(PSI_T_DEFINED); goto start; }
+ 'UNDEF' { NEWTOKEN(PSI_T_UNDEF); goto start; }
+ 'WARNING' { NEWTOKEN(PSI_T_WARNING); goto start; }
+ 'ERROR' { NEWTOKEN(PSI_T_ERROR); goto start; }
+ 'INCLUDE' { NEWTOKEN(PSI_T_INCLUDE); goto start; }
+ 'INCLUDE_NEXT' { NEWTOKEN(PSI_T_INCLUDE_NEXT); goto start; }
+ 'TRUE' { NEWTOKEN(PSI_T_TRUE); goto start; }
+ 'FALSE' { NEWTOKEN(PSI_T_FALSE); goto start; }
+ 'NULL' { NEWTOKEN(PSI_T_NULL); goto start; }
+ 'MIXED' { NEWTOKEN(PSI_T_MIXED); goto start; }
+ 'CALLABLE' { NEWTOKEN(PSI_T_CALLABLE); goto start; }
+ 'STRING' { NEWTOKEN(PSI_T_STRING); goto start; }
+ 'ARRAY' { NEWTOKEN(PSI_T_ARRAY); goto start; }
+ 'OBJECT' { NEWTOKEN(PSI_T_OBJECT); goto start; }
+ 'CALLBACK' { NEWTOKEN(PSI_T_CALLBACK); goto start; }
+ 'STATIC' { NEWTOKEN(PSI_T_STATIC); goto start; }
+ 'FUNCTION' { NEWTOKEN(PSI_T_FUNCTION); goto start; }
+ 'LIB' { NEWTOKEN(PSI_T_LIB); goto start; }
+ 'LET' { NEWTOKEN(PSI_T_LET); goto start; }
+ 'SET' { NEWTOKEN(PSI_T_SET); goto start; }
+ 'PRE_ASSERT' { NEWTOKEN(PSI_T_PRE_ASSERT); goto start; }
+ 'POST_ASSERT' { NEWTOKEN(PSI_T_POST_ASSERT); goto start; }
+ 'RETURN' { NEWTOKEN(PSI_T_RETURN); goto start; }
+ 'FREE' { NEWTOKEN(PSI_T_FREE); goto start; }
+ 'TEMP' { NEWTOKEN(PSI_T_TEMP); goto start; }
+ 'STRLEN' { NEWTOKEN(PSI_T_STRLEN); goto start; }
+ 'STRVAL' { NEWTOKEN(PSI_T_STRVAL); goto start; }
+ 'PATHVAL' { NEWTOKEN(PSI_T_PATHVAL); goto start; }
+ 'INTVAL' { NEWTOKEN(PSI_T_INTVAL); goto start; }
+ 'FLOATVAL' { NEWTOKEN(PSI_T_FLOATVAL); goto start; }
+ 'BOOLVAL' { NEWTOKEN(PSI_T_BOOLVAL); goto start; }
+ 'ARRVAL' { NEWTOKEN(PSI_T_ARRVAL); goto start; }
+ 'OBJVAL' { NEWTOKEN(PSI_T_OBJVAL); goto start; }
+ 'ZVAL' { NEWTOKEN(PSI_T_ZVAL); goto start; }
+ 'COUNT' { NEWTOKEN(PSI_T_COUNT); goto start; }
+ 'CALLOC' { NEWTOKEN(PSI_T_CALLOC); goto start; }
+ 'TO_OBJECT' { NEWTOKEN(PSI_T_TO_OBJECT); goto start; }
+ 'TO_ARRAY' { NEWTOKEN(PSI_T_TO_ARRAY); goto start; }
+ 'TO_STRING' { NEWTOKEN(PSI_T_TO_STRING); goto start; }
+ 'TO_INT' { NEWTOKEN(PSI_T_TO_INT); goto start; }
+ 'TO_FLOAT' { NEWTOKEN(PSI_T_TO_FLOAT); goto start; }
+ 'TO_BOOL' { NEWTOKEN(PSI_T_TO_BOOL); goto start; }
+ NAME { NEWTOKEN(PSI_T_NAME); goto start; }
+ NSNAME { NEWTOKEN(PSI_T_NSNAME); goto start; }
+ DOLLAR_NAME { NEWTOKEN(PSI_T_DOLLAR_NAME); goto start; }
+ CPP_HEADER { tok += 1; cur -= 1; NEWTOKEN(PSI_T_CPP_HEADER); cur += 1; goto start; }
+ CPP_ATTRIBUTE { parens = 2; goto cpp_attribute; }
+ EOL { NEWTOKEN(PSI_T_EOL); NEWLINE(); goto start; }
+ SP+ { NEWTOKEN(PSI_T_WHITESPACE); goto start; }
+ [^] { NEWTOKEN(-2); goto error; }
+ * { NEWTOKEN(-1); goto error; }
+