mirror of https://github.com/yasm/yasm.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
5.4 KiB
319 lines
5.4 KiB
#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; |
|
} |
|
*/ |
|
}
|
|
|