📄 scan.re
字号:
:segment AS_ALPHA
symqual = "."?[a-zA-Z_$][a-zA-Z0-9_.$]*"/"[sSvVuUiIcCmMdD]+; /* ins with qualifier */
:endsegment
esc = dot \ [\\];
fname = dot*;
string = "\"" ((esc \ ["] ) | "\\" dot)* "\"";
ppchar = "#"; /* preprocessor character */
empstr = ""; /* empty string */
*/
extern int asyylex( void ) {
//**************************
if( DirGetNextScanState() == TRUE ) goto getdirop;
std: tok = cursor;
/*!re2c
ws { goto std; }
:segment _STANDALONE_
ppchar"error "dot* { ppError( yytext()+7 ); goto std; }
ppchar"line "[0-9]* { newlineno = atoi( yytext()+6 ); goto getfname; }
:endsegment
:segment AS_ALPHA
"$"[0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$"[1-2][0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$"[3][0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$v0" { asyylval.reg = MakeReg( RC_GPR, 0 ); return( T_REGISTER ); }
"$t"[0-7] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 1 ); return( T_REGISTER ); }
"$s"[0-6] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 9 ); return( T_REGISTER ); }
"$fp" { asyylval.reg = MakeReg( RC_GPR, 15 ); return( T_REGISTER ); }
"$a"[0-5] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 16 ); return( T_REGISTER ); }
"$t"[8-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 14 ); return( T_REGISTER ); }
"$t"[1][0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 14 ); return( T_REGISTER ); }
"$ra" { asyylval.reg = MakeReg( RC_GPR, 26 ); return( T_REGISTER ); }
"$pv" { asyylval.reg = MakeReg( RC_GPR, 27 ); return( T_REGISTER ); }
"$t12" { asyylval.reg = MakeReg( RC_GPR, 27 ); return( T_REGISTER ); }
"$at" { asyylval.reg = MakeReg( RC_GPR, 28 ); return( T_REGISTER ); }
"$gp" { asyylval.reg = MakeReg( RC_GPR, 29 ); return( T_REGISTER ); }
"$sp" { asyylval.reg = MakeReg( RC_GPR, 30 ); return( T_REGISTER ); }
"$zero" { asyylval.reg = MakeReg( RC_GPR, 31 ); return( T_REGISTER ); }
"$f"[0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
"$f"[1-2][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
"$f"[3][0-1] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
:elsesegment AS_MIPS
"$"[0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$"[1-2][0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$"[3][0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"$zero" { asyylval.reg = MakeReg( RC_GPR, 0 ); return( T_REGISTER ); }
"$at" { asyylval.reg = MakeReg( RC_GPR, 1 ); return( T_REGISTER ); }
"$v"[0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 2 ); return( T_REGISTER ); }
"$a"[0-3] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 4 ); return( T_REGISTER ); }
"$t"[0-7] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 8 ); return( T_REGISTER ); }
"$s"[0-7] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 16 ); return( T_REGISTER ); }
"$t"[8-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 16 ); return( T_REGISTER ); }
"$k"[0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+2 ) + 26 ); return( T_REGISTER ); }
"$gp" { asyylval.reg = MakeReg( RC_GPR, 28 ); return( T_REGISTER ); }
"$sp" { asyylval.reg = MakeReg( RC_GPR, 29 ); return( T_REGISTER ); }
"$s8" { asyylval.reg = MakeReg( RC_GPR, 30 ); return( T_REGISTER ); }
"$fp" { asyylval.reg = MakeReg( RC_GPR, 30 ); return( T_REGISTER ); }
"$ra" { asyylval.reg = MakeReg( RC_GPR, 31 ); return( T_REGISTER ); }
"$f"[0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
"$f"[1-2][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
"$f"[3][0-1] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
:elsesegment AS_PPC
[rR][0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
[rR][1-2][0-9] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
[rR][3][0-1] { asyylval.reg = MakeReg( RC_GPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
"sp" { asyylval.reg = MakeReg( RC_GPR, 1 ); return( T_REGISTER ); }
"rtoc" { asyylval.reg = MakeReg( RC_GPR, 2 ); return( T_REGISTER ); }
[fF][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
[fF][1-2][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
[fF][3][0-1] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+1 ) ); return( T_REGISTER ); }
[fF][rR][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
[fF][rR][1-2][0-9] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
[fF][rR][3][0-1] { asyylval.reg = MakeReg( RC_FPR, atoi( yytext()+2 ) ); return( T_REGISTER ); }
[cC][rR][bB][0-9] { asyylval.reg = MakeReg( RC_CRB, atoi( yytext()+3 ) ); return( T_REGISTER ); }
[cC][rR][bB][1-2][0-9] { asyylval.reg = MakeReg( RC_CRB, atoi( yytext()+3 ) ); return( T_REGISTER ); }
[cC][rR][bB][3][0-1] { asyylval.reg = MakeReg( RC_CRB, atoi( yytext()+3 ) ); return( T_REGISTER ); }
[cC][rR][0-7] { asyylval.reg = MakeReg( RC_CRF, atoi( yytext()+2 ) ); return( T_REGISTER ); }
/* The following symbols are defined just for the BI field of the simplified
branch mnemonics. */
"lt" { asyylval.val = BI_LT; return( T_BI_OFFSET ); }
"gt" { asyylval.val = BI_GT; return( T_BI_OFFSET ); }
"eq" { asyylval.val = BI_EQ; return( T_BI_OFFSET ); }
"so" { asyylval.val = BI_SO; return( T_BI_OFFSET ); }
"un" { asyylval.val = BI_UN; return( T_BI_OFFSET ); }
:endsegment
:segment AS_ALPHA
symqual {
sym_handle sym;
sym = SymLookup( yytext() );
if( sym != NULL ) {
asyylval.sym = sym;
assert( SymClass( sym ) == SYM_INSTRUCTION );
return( T_OPCODE );
}
return( T_ERROR );
}
:endsegment
sym {
sym_handle sym;
char *symstr;
if( *yytext() == '`' ) {
symstr = stripBackQuotes( _yytext );
} else {
symstr = _yytext;
}
sym = SymLookup( symstr );
if( sym != NULL ) {
asyylval.sym = sym;
switch( SymClass( sym ) ) {
case SYM_INSTRUCTION: return( T_OPCODE );
case SYM_LABEL: return( T_IDENTIFIER );
case SYM_DIRECTIVE: DirSetNextScanState( sym ); return( T_DIRECTIVE );
}
} else {
sym = SymAdd( symstr, SYM_LABEL );
asyylval.sym = sym;
return( T_IDENTIFIER );
}
}
[0-9]":" { asyylval.val = *yytext() - '0' + 1; return( T_NUMERIC_LABEL ); }
[0-9]"b" { asyylval.val = '0' - *yytext() - 1; return( T_NUMLABEL_REF ); }
[0-9]"f" { asyylval.val = *yytext() - '0' + 1; return( T_NUMLABEL_REF ); }
[1-9][0-9]* { asyylval.val = atoi( yytext() ); return( T_INTEGER_CONST ); }
"0"[Xx][0-9a-fA-F]+ |
"0"[0-7]* { asyylval.val = strtoul( yytext(), NULL, 0 ); return( T_INTEGER_CONST ); }
"0"[Bb][0-1]+ { asyylval.val = strtoul( yytext()+2, NULL, 2 ); return( T_INTEGER_CONST ); }
[0-9]+"."[0-9]* |
[0-9]*"."[0-9]+ { asyylval.fval = strtod( yytext(), NULL ); return( T_FLOAT_CONST ); }
string {
MemFree( cStr );
asyylval.str = ( cStr = AsStrdup( yytext()+1 ) );
cStr[yytextlen - 2] = NULL;
return( T_STRING_CONST );
}
[Ll]"^" { asyylval.rtype = ASM_RELOC_HALF_LO; return( T_RELOC_MODIFIER ); }
[Hh]"^" { asyylval.rtype = ASM_RELOC_HALF_HI; return( T_RELOC_MODIFIER ); }
[Hh][Aa]"^" { asyylval.rtype = ASM_RELOC_HALF_HA; return( T_RELOC_MODIFIER ); }
[Jj]"^" { asyylval.rtype = ASM_RELOC_JUMP; return( T_RELOC_MODIFIER ); }
:segment !AS_ALPHA
[Bb]"^" { asyylval.rtype = ASM_RELOC_BRANCH; return( T_RELOC_MODIFIER ); }
:endsegment
"(" { return( T_LEFT_PAREN ); }
")" { return( T_RIGHT_PAREN ); }
"," { return( T_COMMA ); }
":" { return( T_COLON ); }
";" { return( T_SEMICOLON ); }
"|" { return( T_OR ); }
"^" { return( T_XOR ); }
"&" { return( T_AND ); }
">>" { return( T_SHIFT_RIGHT ); }
"<<" { return( T_SHIFT_LEFT ); }
"+" { return( T_PLUS ); }
"-" { return( T_MINUS ); }
"*" { return( T_TIMES ); }
"/" { return( T_DIVIDE ); }
"%" { return( T_MOD ); }
"~" { return( T_NOT ); }
:segment _STANDALONE_
nl { ++asyylineno; return( T_NEWLINE ); }
:endsegment
any {
if( eofPtr && ( cursor == eofPtr ) ) {
return( NULL ); // end of input
}
return( T_ERROR );
}
*/
#ifdef _STANDALONE_
getfname: tok = cursor;
/*!re2c
ws { goto getfname; }
"\""fname"\"" {
MemFree( asyyfname );
asyyfname = AsStrdup( yytext()+1 );
asyyfname[yytextlen - 2] = NULL;
dropDblBackSlashes( asyyfname );
goto getfname;
}
nl {
fileinfo *file;
file = MemAlloc( sizeof( fileinfo ) + strlen( asyyfname ) );
file->line = asyylineno = newlineno;
strcpy( file->name, asyyfname );
asyylval.file = file;
return( T_FILE_SWITCH );
}
(dot \ [ \t])+ {
yylexError( IMPROPER_LINE_DIRECTIVE );
goto std;
}
*/
#endif
getdirop: tok = cursor;
/*!re2c
ws { goto getdirop; }
((ch \ [ \t]) ch*) |
empstr {
MemFree( dirOpStr );
asyylval.str = ( dirOpStr = AsStrdup( yytext() ) );
return( T_DIRECTIVE_OPERAND );
}
*/
}
#pragma on( unreferenced );
void asyyerror( char *s ) {
//*************************
// Code within this module should use yylexError() instead
if( *yytext() == '\n' ) {
// to beautify the error output
Error( PROBLEM_AT_EOL, s );
return;
}
if( *_yytext == '\0' ) {
Error( PROBLEM_AT_EOS, s );
return;
}
Error( PROBLEM_AT_WHERE, s, _yytext );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -