From cf46fd449bd2b7a6ff41ac174c46af5ac41eb509 Mon Sep 17 00:00:00 2001 From: jaortega Date: Sat, 18 Nov 2000 12:04:24 +0000 Subject: fixed 3H ORIG 3B problem (samples/stress{1,2}.mixal) --- mixlib/mix_scanner.l | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'mixlib/mix_scanner.l') diff --git a/mixlib/mix_scanner.l b/mixlib/mix_scanner.l index c6ed5d8..c5529da 100644 --- a/mixlib/mix_scanner.l +++ b/mixlib/mix_scanner.l @@ -37,20 +37,28 @@ g_free (symbol); \ symbol = NULL; \ } \ + if (lsymbol != NULL) \ + { \ + g_free (lsymbol); \ + lsymbol = NULL; \ + } \ } while (FALSE) -#define NEXT() \ - do { \ - parser->loc_count++; \ - RESET (); \ - ++lineno; \ - BEGIN (INITIAL); \ +#define NEXT() \ + do { \ + if (lsymbol != NULL) \ + mix_parser_manage_local_symbol (parser,lsymbol, \ + loc); \ + parser->loc_count++; \ + RESET (); \ + ++lineno; \ + BEGIN (INITIAL); \ } while (FALSE) #define ADD_INS() \ do { \ mix_parser_add_ins (parser, &ins, lineno); \ - NEXT (); \ + NEXT (); \ } while (FALSE) #define ADD_RAW(value) \ @@ -140,7 +148,8 @@ wexpr {expr}({fpart})?(,{expr}({fpart})?)* gboolean nof = FALSE, is_fp = FALSE, end = FALSE, lsf = FALSE; mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO, wexpr_val_tmp = MIX_WORD_ZERO; - gchar *symbol = NULL; + gchar *symbol = NULL, *lsymbol = NULL; + mix_address_t loc = MIX_SHORT_ZERO; guint lineno = 1; mix_ins_fill_from_id (ins, mix_NOP); ins.address = 0; @@ -172,9 +181,25 @@ wexpr {expr}({fpart})?(,{expr}({fpart})?)* { {ws}+ BEGIN (OP); /* LOC field is empty */ {locsymbol} { /* manage local symbol */ - mix_parser_manage_local_symbol (parser,yytext); + loc = get_ploc_ (parser); + lsymbol = g_strdup (yytext); + if ( lsymbol == NULL ) { + mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); + return MIX_PERR_INTERNAL; + } BEGIN (OP); } + {locsymbol}/({ws}+EQU) {/* local symbol with value */ + loc = get_ploc_ (parser); + symbol = g_strdup (yytext); + lsymbol = g_strdup (yytext); + if ( symbol == NULL || lsymbol == NULL) { + mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); + return MIX_PERR_INTERNAL; + } + symbol[1] = 'B'; /* this will be referred as nB afterwards */ + BEGIN (OP); + } {flocsymbol}|{blocsymbol} RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext); {symbol}/({ws}+EQU) { /* store symbol name for future definition */ symbol = g_strdup (yytext); -- cgit v1.2.3