⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan.re

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 RE
📖 第 1 页 / 共 2 页
字号:
: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 + -