📄 lex.yy.c
字号:
#else
YY_BUFFER_STATE yy_scan_string( yy_str )
yyconst char *yy_str;
#endif
{
int len;
for ( len = 0; yy_str[len]; ++len )
;
return yy_scan_bytes( yy_str, len );
}
#endif
#ifndef YY_NO_SCAN_BYTES
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
#else
YY_BUFFER_STATE yy_scan_bytes( bytes, len )
yyconst char *bytes;
int len;
#endif
{
YY_BUFFER_STATE b;
char *buf;
yy_size_t n;
int i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = len + 2;
buf = (char *) yy_flex_alloc( n );
if ( ! buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
for ( i = 0; i < len; ++i )
buf[i] = bytes[i];
buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
b = yy_scan_buffer( buf, n );
if ( ! b )
YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
/* It's okay to grow etc. this buffer, and we should throw it
* away when we're done.
*/
b->yy_is_our_buffer = 1;
return b;
}
#endif
#ifndef YY_NO_PUSH_STATE
#ifdef YY_USE_PROTOS
static void yy_push_state( int new_state )
#else
static void yy_push_state( new_state )
int new_state;
#endif
{
if ( yy_start_stack_ptr >= yy_start_stack_depth )
{
yy_size_t new_size;
yy_start_stack_depth += YY_START_STACK_INCR;
new_size = yy_start_stack_depth * sizeof( int );
if ( ! yy_start_stack )
yy_start_stack = (int *) yy_flex_alloc( new_size );
else
yy_start_stack = (int *) yy_flex_realloc(
(void *) yy_start_stack, new_size );
if ( ! yy_start_stack )
YY_FATAL_ERROR(
"out of memory expanding start-condition stack" );
}
yy_start_stack[yy_start_stack_ptr++] = YY_START;
BEGIN(new_state);
}
#endif
#ifndef YY_NO_POP_STATE
static void yy_pop_state()
{
if ( --yy_start_stack_ptr < 0 )
YY_FATAL_ERROR( "start-condition stack underflow" );
BEGIN(yy_start_stack[yy_start_stack_ptr]);
}
#endif
#ifndef YY_NO_TOP_STATE
static int yy_top_state()
{
return yy_start_stack[yy_start_stack_ptr - 1];
}
#endif
#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif
#ifdef YY_USE_PROTOS
static void yy_fatal_error( yyconst char msg[] )
#else
static void yy_fatal_error( msg )
char msg[];
#endif
{
(void) fprintf( stderr, "%s\n", msg );
exit( YY_EXIT_FAILURE );
}
/* Redefine yyless() so it works in section 3 code. */
#undef yyless
#define yyless(n) \
do \
{ \
/* Undo effects of setting up yytext. */ \
yytext[yyleng] = yy_hold_char; \
yy_c_buf_p = yytext + n; \
yy_hold_char = *yy_c_buf_p; \
*yy_c_buf_p = '\0'; \
yyleng = n; \
} \
while ( 0 )
/* Internal utility routines. */
#ifndef yytext_ptr
#ifdef YY_USE_PROTOS
static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
#else
static void yy_flex_strncpy( s1, s2, n )
char *s1;
yyconst char *s2;
int n;
#endif
{
register int i;
for ( i = 0; i < n; ++i )
s1[i] = s2[i];
}
#endif
#ifdef YY_NEED_STRLEN
#ifdef YY_USE_PROTOS
static int yy_flex_strlen( yyconst char *s )
#else
static int yy_flex_strlen( s )
yyconst char *s;
#endif
{
register int n;
for ( n = 0; s[n]; ++n )
;
return n;
}
#endif
#ifdef YY_USE_PROTOS
static void *yy_flex_alloc( yy_size_t size )
#else
static void *yy_flex_alloc( size )
yy_size_t size;
#endif
{
return (void *) malloc( size );
}
#ifdef YY_USE_PROTOS
static void *yy_flex_realloc( void *ptr, yy_size_t size )
#else
static void *yy_flex_realloc( ptr, size )
void *ptr;
yy_size_t size;
#endif
{
/* The cast to (char *) in the following accommodates both
* implementations that use char* generic pointers, and those
* that use void* generic pointers. It works with the latter
* because both ANSI C and C++ allow castless assignment from
* any pointer type to void*, and deal with argument conversions
* as though doing an assignment.
*/
return (void *) realloc( (char *) ptr, size );
}
#ifdef YY_USE_PROTOS
static void yy_flex_free( void *ptr )
#else
static void yy_flex_free( ptr )
void *ptr;
#endif
{
free( ptr );
}
#if YY_MAIN
int main()
{
yylex();
return 0;
}
#endif
#line 316 "scanner.l"
#ifdef __STDC__
void
initialize_scanner (FILE *in_file)
#else
void
initialize_scanner (in_file)
FILE *in_file;
#endif
{
yyin = in_file;
#ifdef FLEX_SCANNER
yyrestart(in_file);
yy_init = 1;
#endif
line_no = 1;
current_line = NULL;
line_returned = 0;
eof_returned = 0;
}
#ifdef __STDC__
void
scanner_start_line (void)
#else
void
scanner_start_line ()
#endif
{
current_line = NULL;
line_returned = 0;
}
/* Use yywrap to insert a marker character, which causes the
scanner to return Y_EOF, before return a hard EOF. This
wouldn't be necessary, except that bison does not allow
the parser to use EOF (= 0) as a non-terminal */
int yywrap()
{
if (eof_returned)
return (1);
else
{
unput ('\001');
eof_returned = 1;
#ifdef FLEX_SCANNER
yy_did_buffer_switch_on_eof = 1;
#endif
return (0);
}
}
/* Return a freshly-allocated copy of STRING with the last CHOP
characters removed. */
#ifdef __STDC__
static YY_CHAR *
copy_str (YY_CHAR *str, int chop)
#else
static YY_CHAR *
copy_str (str, chop)
YY_CHAR *str;
int chop;
#endif
{
register int new_len = strlen (str) - chop;
register YY_CHAR *new_str = (YY_CHAR *) xmalloc (new_len + 1), *n;
for (n = new_str; *str != '\0' && new_len > 0; new_len -= 1)
if (*str == '\\')
switch (*(str + 1))
{
case 'n':
{
*n ++ = '\n';
str += 2;
new_len -= 1;
continue;
}
case 't':
{
*n ++ = '\t';
str += 2;
new_len -= 1;
continue;
}
case '"':
{
*n ++ = '"';
str += 2;
new_len -= 1;
continue;
}
case 'X':
{
YY_CHAR c1 = *(str + 2), c2 = *(str + 3);
int b = 0;
if ('0' <= c1 && c1 <= '9') b = c1 - '0';
else if ('A' <= c1 && c1 <= 'F') b = c1 - 'A' + 10;
else yyerror ("Bad character in \\X construct in string");
b <<= 4;
if ('0' <= c2 && c2 <= '9') b += c2 - '0';
else if ('A' <= c2 && c2 <= 'F') b += c2 - 'A' + 10;
else yyerror ("Bad character in \\X construct in string");
*n ++ = (YY_CHAR) b;
str += 4;
new_len -= 3;
continue;
}
default:
{
*n ++ = *str ++;
continue;
}
}
else
*n ++ = *str ++;
*n = '\0';
y_str_length = n - new_str;
return (new_str);
}
/* On a parse error, write out the current line and print a caret (^)
below the point at which the error occured. Also, reset the input
stream to the begining of the next line. */
#ifdef __STDC__
void
print_erroneous_line (void)
#else
void
print_erroneous_line ()
#endif
{
int prefix_length = yytext - current_line;
int i, c;
YY_CHAR buffer[1024], *bp = buffer;
if (current_line == NULL) return;
error (" ");
c = *(current_line + prefix_length);
*(current_line + prefix_length) = '\0';
error ("%s", current_line);
*(current_line + prefix_length) = (char)c;
error ("%s", yytext);
/* Flush the rest of the line. */
if (*yytext != '\n')
{
while ((c = input ()) != '\n' && c != EOF)
*bp ++ = (char)c;
*bp = '\0';
error ("%s\n", buffer);
if (c == '\n') unput ('\n');
current_line = NULL;
}
if (1024 <= prefix_length) return;
error (" ");
for (i = 0; i < prefix_length; i ++) buffer[i] = ' ';
buffer[i] = '\0';
error ("%s^\n", buffer);
}
static inst_info keyword_tbl [] = {
#undef OP
#define OP(NAME, OPCODE, TYPE, R_OPCODE) {NAME, OPCODE, TYPE},
#include "op.h"
};
#ifdef __STDC__
static int
check_keyword (YY_CHAR *id, int allow_pseudo_ops)
#else
static int
check_keyword (id, allow_pseudo_ops)
YY_CHAR *id;
int allow_pseudo_ops;
#endif
{
inst_info *entry =
map_string_to_inst_info (keyword_tbl,
sizeof(keyword_tbl) / sizeof (inst_info),
id);
if (entry == NULL)
return (0);
else if (!allow_pseudo_ops && entry->value2 == PSEUDO_OP)
return (0);
else
return (entry->value1);
}
static inst_info register_tbl [] = {
{"a0", 4, 0},
{"a1", 5, 0},
{"a2", 6, 0},
{"a3", 7, 0},
{"at", 1, 0},
{"fp", 30, 0},
{"gp", 28, 0},
{"k0", 26, 0},
{"k1", 27, 0},
{"kt0", 26, 0},
{"kt1", 27, 0},
{"ra", 31, 0},
{"s0", 16, 0},
{"s1", 17, 0},
{"s2", 18, 0},
{"s3", 19, 0},
{"s4", 20, 0},
{"s5", 21, 0},
{"s6", 22, 0},
{"s7", 23, 0},
{"s8", 30, 0},
{"sp", 29, 0},
{"t0", 8, 0},
{"t1", 9, 0},
{"t2", 10, 0},
{"t3", 11, 0},
{"t4", 12, 0},
{"t5", 13, 0},
{"t6", 14, 0},
{"t7", 15, 0},
{"t8", 24, 0},
{"t9", 25, 0},
{"v0", 2, 0},
{"v1", 3, 0},
{"zero", 0, 0}
};
#ifdef __STDC__
int
register_name_to_number (char *name)
#else
int
register_name_to_number (name)
char *name;
#endif
{
register int c1 = *name, c2 = *(name + 1);
if ('0' <= c1 && c1 <= '9'
&& (c2 == '\0' || (('0' <= c2 && c2 <= '9') && *(name + 2) == '\0')))
return (atoi (name));
else if (c1 == 'f' && c2 >= '0' && c2 <= '9')
return atoi (name + 1);
else
{
inst_info *entry =
map_string_to_inst_info (register_tbl,
sizeof (register_tbl) / sizeof (inst_info),
name);
if (entry == NULL)
return (-1);
else
return (entry->value1);
}
}
/* Exactly once, return the current source line, as a printable string
with a line number. Subsequent calls receive NULL instead of the
line. */
#ifdef __STDC__
char *
source_line ()
#else
char *
source_line ()
#endif
{
if (line_returned)
return (NULL);
else if (current_line == NULL) /* Error on line */
return (NULL);
else
{
YY_CHAR *eol1, c1;
YY_CHAR *null1 = NULL;
char *r;
/* Find end of line: */
for (eol1 = current_line; *eol1 != '\0' && *eol1 != '\n'; ) eol1 += 1;
/* Ran into null byte, inserted by yylex. In necessary, look further
for newline */
if (*eol1 == '\0' && yy_hold_char != '\n')
{
null1 = eol1;
*eol1 = yy_hold_char;
for ( ; *eol1 != '\0' && *eol1 != '\n'; )
eol1 += 1;
}
/* Save end-of-line character and null terminate string so it can
be printed. */
c1 = *eol1;
*eol1 = '\0';
r = (char *) xmalloc (eol1 - current_line + 10);
sprintf (r, "%d: %s", current_line_no, current_line);
/* Restore end-of-line character and, if necessary, yylex's null byte. */
*eol1 = c1;
if (null1 != NULL)
{
*null1 = '\0';
}
line_returned = 1;
return ((char *) r);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -