mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-29 23:33:00 +00:00
319 lines
5.4 KiB
C++
319 lines
5.4 KiB
C++
#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;
|
|
}
|
|
*/
|
|
}
|