#include "scanio.h" #include "scanner.h" #define CURSOR ch #define LOADCURSOR ch = *cursor; #define ADVANCE cursor++; #define BACK(n) cursor -= (n); #define CHECK(n) if((ScanCB.lim - cursor) < (n)){cursor = ScanFill(cursor);} #define MARK(n) ScanCB.ptr = cursor; sel = (n); #define REVERT cursor = ScanCB.ptr; #define MARKER sel #define RETURN(i) {ScanCB.cur = cursor; return i;} int ScanToken(){ uchar *cursor = ScanCB.cur; unsigned sel; uchar ch; ScanCB.tok = cursor; ScanCB.eot = NULL; /*!re2c all = [\000-\377]; eof = [\000]; any = all\eof; letter = [a-z]|[A-Z]; digit = [0-9]; symchr = letter|digit|[.!?_]; const = (digit|[.])symchr*([eE][+-]?digit+)?; simple = (symchr\(digit|[.]))(symchr\[.])*; stem = simple [.]; symbol = symchr*; sqstr = ['] ((any\['\n])|(['][']))* [']; dqstr = ["] ((any\["\n])|(["]["]))* ["]; str = sqstr|dqstr; ob = [ \t]*; not = [\\~]; A = [aA]; B = [bB]; C = [cC]; D = [dD]; E = [eE]; F = [fF]; G = [gG]; H = [hH]; I = [iI]; J = [jJ]; K = [kK]; L = [lL]; M = [mM]; N = [nN]; O = [oO]; P = [pP]; Q = [qQ]; R = [rR]; S = [sS]; T = [tT]; U = [uU]; V = [vV]; W = [wW]; X = [xX]; Y = [yY]; Z = [zZ]; */ scan: /*!re2c "\n" { ++(ScanCB.lineNum); ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk); RETURN(SU_EOL); } "|" ob "|" { RETURN(OP_CONCAT); } "+" { RETURN(OP_PLUS); } "-" { RETURN(OP_MINUS); } "*" { RETURN(OP_MULT); } "/" { RETURN(OP_DIV); } "%" { RETURN(OP_IDIV); } "/" ob "/" { RETURN(OP_REMAIN); } "*" ob "*" { RETURN(OP_POWER); } "=" { RETURN(OP_EQUAL); } not ob "=" | "<" ob ">" | ">" ob "<" { RETURN(OP_EQUAL_N); } ">" { RETURN(OP_GT); } "<" { RETURN(OP_LT); } ">" ob "=" | not ob "<" { RETURN(OP_GE); } "<" ob "=" | not ob ">" { RETURN(OP_LE); } "=" ob "=" { RETURN(OP_EQUAL_EQ); } not ob "=" ob "=" { RETURN(OP_EQUAL_EQ_N); } ">" ob ">" { RETURN(OP_GT_STRICT); } "<" ob "<" { RETURN(OP_LT_STRICT); } ">" ob ">" ob "=" | not ob "<" ob "<" { RETURN(OP_GE_STRICT); } "<" ob "<" ob "=" | not ob ">" ob ">" { RETURN(OP_LE_STRICT); } "&" { RETURN(OP_AND); } "|" { RETURN(OP_OR); } "&" ob "&" { RETURN(OP_XOR); } not { RETURN(OP_NOT); } ":" { RETURN(SU_COLON); } "," { RETURN(SU_COMMA); } "(" { RETURN(SU_POPEN); } ")" { RETURN(SU_PCLOSE); } ";" { RETURN(SU_EOC); } A D D R E S S { RETURN(RX_ADDRESS); } A R G { RETURN(RX_ARG); } C A L L { RETURN(RX_CALL); } D O { RETURN(RX_DO); } D R O P { RETURN(RX_DROP); } E L S E { RETURN(RX_ELSE); } E N D { RETURN(RX_END); } E X I T { RETURN(RX_EXIT); } I F { RETURN(RX_IF); } I N T E R P R E T { RETURN(RX_INTERPRET); } I T E R A T E { RETURN(RX_ITERATE); } L E A V E { RETURN(RX_LEAVE); } N O P { RETURN(RX_NOP); } N U M E R I C { RETURN(RX_NUMERIC); } O P T I O N S { RETURN(RX_OPTIONS); } O T H E R W I S E { RETURN(RX_OTHERWISE); } P A R S E { RETURN(RX_PARSE); } P R O C E D U R E { RETURN(RX_PROCEDURE); } P U L L { RETURN(RX_PULL); } P U S H { RETURN(RX_PUSH); } Q U E U E { RETURN(RX_QUEUE); } R E T U R N { RETURN(RX_RETURN); } S A Y { RETURN(RX_SAY); } S E L E C T { RETURN(RX_SELECT); } S I G N A L { RETURN(RX_SIGNAL); } T H E N { RETURN(RX_THEN); } T R A C E { RETURN(RX_TRACE); } W H E N { RETURN(RX_WHEN); } O F F { RETURN(RXS_OFF); } O N { RETURN(RXS_ON); } B Y { RETURN(RXS_BY); } D I G I T S { RETURN(RXS_DIGITS); } E N G I N E E R I N G { RETURN(RXS_ENGINEERING); } E R R O R { RETURN(RXS_ERROR); } E X P O S E { RETURN(RXS_EXPOSE); } F A I L U R E { RETURN(RXS_FAILURE); } F O R { RETURN(RXS_FOR); } F O R E V E R { RETURN(RXS_FOREVER); } F O R M { RETURN(RXS_FORM); } F U Z Z { RETURN(RXS_FUZZ); } H A L T { RETURN(RXS_HALT); } L I N E I N { RETURN(RXS_LINEIN); } N A M E { RETURN(RXS_NAME); } N O T R E A D Y { RETURN(RXS_NOTREADY); } N O V A L U E { RETURN(RXS_NOVALUE); } S C I E N T I F I C { RETURN(RXS_SCIENTIFIC); } S O U R C E { RETURN(RXS_SOURCE); } S Y N T A X { RETURN(RXS_SYNTAX); } T O { RETURN(RXS_TO); } U N T I L { RETURN(RXS_UNTIL); } U P P E R { RETURN(RXS_UPPER); } V A L U E { RETURN(RXS_VALUE); } V A R { RETURN(RXS_VAR); } V E R S I O N { RETURN(RXS_VERSION); } W H I L E { RETURN(RXS_WHILE); } W I T H { RETURN(RXS_WITH); } const { RETURN(SU_CONST); } simple { RETURN(SU_SYMBOL); } stem { RETURN(SU_SYMBOL_STEM); } symbol { RETURN(SU_SYMBOL_COMPOUND); } str { RETURN(SU_LITERAL); } str [bB] / (all\symchr) { RETURN(SU_LITERAL_BIN); } str [xX] / (all\symchr) { RETURN(SU_LITERAL_HEX); } eof { RETURN(SU_EOF); } any { RETURN(SU_ERROR); } */ } bool StripToken(){ uchar *cursor = ScanCB.cur; unsigned depth; uchar ch; bool blanks = FALSE; ScanCB.eot = cursor; strip: /*!re2c "/*" { depth = 1; goto comment; } "\r" { goto strip; } [ \t] { blanks = TRUE; goto strip; } [] / all { RETURN(blanks); } */ comment: /*!re2c "*/" { if(--depth == 0) goto strip; else goto comment; } "\n" { ++(ScanCB.lineNum); ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk); goto comment; } "/*" { ++depth; goto comment; } eof { RETURN(blanks); } any { goto comment; } */ }