mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-12 21:52:12 +00:00
320 lines
5.4 KiB
Text
320 lines
5.4 KiB
Text
|
#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;
|
||
|
}
|
||
|
*/
|
||
|
}
|