comparison libinterp/parse-tree/lex.ll @ 16126:5c885c13bfa3

localize use of yylval.tok_val in lexical_feedback member functions * lex.h, lex.ll (lexical_feedback::push_token): New function. (lexical_feedback::current_token): New function. (lexical_feedback::token_stack): Now private. * lex.ll (TOK_PUSH_AND_RETURN, BIN_OP_RETURN_INTERNAL, lexical_feedback::is_keyword_token, lexical_feedback::handle_number, lexical_feedback::handle_string, lexical_feedback::handle_superclass_identifier, lexical_feedback::handle_meta_identifier, lexical_feedback::handle_identifier, lexical_feedback::display_token): Use push_token and current_token instead of accessing yylval.tok_val directly.
author John W. Eaton <jwe@octave.org>
date Tue, 26 Feb 2013 15:13:43 -0500
parents 96a58f197f93
children 210039e91ad6
comparison
equal deleted inserted replaced
16125:96a58f197f93 16126:5c885c13bfa3
156 while (0) 156 while (0)
157 157
158 #define TOK_PUSH_AND_RETURN(name, tok) \ 158 #define TOK_PUSH_AND_RETURN(name, tok) \
159 do \ 159 do \
160 { \ 160 { \
161 yylval.tok_val = new token (name, curr_lexer->input_line_number, \ 161 curr_lexer->push_token \
162 curr_lexer->current_input_column); \ 162 (new token (name, curr_lexer->input_line_number, \
163 curr_lexer->token_stack.push (yylval.tok_val); \ 163 curr_lexer->current_input_column)); \
164 TOK_RETURN (tok); \ 164 TOK_RETURN (tok); \
165 } \ 165 } \
166 while (0) 166 while (0)
167 167
168 #define BIN_OP_RETURN_INTERNAL(tok, convert, bos, qit) \ 168 #define BIN_OP_RETURN_INTERNAL(tok, convert, bos, qit) \
169 do \ 169 do \
170 { \ 170 { \
171 yylval.tok_val = new token (curr_lexer->input_line_number, \ 171 curr_lexer->push_token \
172 curr_lexer->current_input_column); \ 172 (new token (curr_lexer->input_line_number, \
173 curr_lexer->token_stack.push (yylval.tok_val); \ 173 curr_lexer->current_input_column)); \
174 curr_lexer->current_input_column += yyleng; \ 174 curr_lexer->current_input_column += yyleng; \
175 curr_lexer->quote_is_transpose = qit; \ 175 curr_lexer->quote_is_transpose = qit; \
176 curr_lexer->convert_spaces_to_comma = convert; \ 176 curr_lexer->convert_spaces_to_comma = convert; \
177 curr_lexer->looking_for_object_index = false; \ 177 curr_lexer->looking_for_object_index = false; \
178 curr_lexer->at_beginning_of_statement = bos; \ 178 curr_lexer->at_beginning_of_statement = bos; \
1615 1615
1616 const octave_kw *kw = octave_kw_hash::in_word_set (s.c_str (), len); 1616 const octave_kw *kw = octave_kw_hash::in_word_set (s.c_str (), len);
1617 1617
1618 if (kw) 1618 if (kw)
1619 { 1619 {
1620 yylval.tok_val = 0; 1620 token *tok_val = 0;
1621 1621
1622 switch (kw->kw_id) 1622 switch (kw->kw_id)
1623 { 1623 {
1624 case break_kw: 1624 case break_kw:
1625 case catch_kw: 1625 case catch_kw:
1660 && (defining_func 1660 && (defining_func
1661 && ! (looking_at_return_list 1661 && ! (looking_at_return_list
1662 || parsed_function_name.top ())))) 1662 || parsed_function_name.top ()))))
1663 return 0; 1663 return 0;
1664 1664
1665 yylval.tok_val = new token (token::simple_end, l, c); 1665 tok_val = new token (token::simple_end, l, c);
1666 at_beginning_of_statement = true; 1666 at_beginning_of_statement = true;
1667 break; 1667 break;
1668 1668
1669 case end_try_catch_kw: 1669 case end_try_catch_kw:
1670 yylval.tok_val = new token (token::try_catch_end, l, c); 1670 tok_val = new token (token::try_catch_end, l, c);
1671 at_beginning_of_statement = true; 1671 at_beginning_of_statement = true;
1672 break; 1672 break;
1673 1673
1674 case end_unwind_protect_kw: 1674 case end_unwind_protect_kw:
1675 yylval.tok_val = new token (token::unwind_protect_end, l, c); 1675 tok_val = new token (token::unwind_protect_end, l, c);
1676 at_beginning_of_statement = true; 1676 at_beginning_of_statement = true;
1677 break; 1677 break;
1678 1678
1679 case endfor_kw: 1679 case endfor_kw:
1680 yylval.tok_val = new token (token::for_end, l, c); 1680 tok_val = new token (token::for_end, l, c);
1681 at_beginning_of_statement = true; 1681 at_beginning_of_statement = true;
1682 break; 1682 break;
1683 1683
1684 case endfunction_kw: 1684 case endfunction_kw:
1685 yylval.tok_val = new token (token::function_end, l, c); 1685 tok_val = new token (token::function_end, l, c);
1686 at_beginning_of_statement = true; 1686 at_beginning_of_statement = true;
1687 break; 1687 break;
1688 1688
1689 case endif_kw: 1689 case endif_kw:
1690 yylval.tok_val = new token (token::if_end, l, c); 1690 tok_val = new token (token::if_end, l, c);
1691 at_beginning_of_statement = true; 1691 at_beginning_of_statement = true;
1692 break; 1692 break;
1693 1693
1694 case endparfor_kw: 1694 case endparfor_kw:
1695 yylval.tok_val = new token (token::parfor_end, l, c); 1695 tok_val = new token (token::parfor_end, l, c);
1696 at_beginning_of_statement = true; 1696 at_beginning_of_statement = true;
1697 break; 1697 break;
1698 1698
1699 case endswitch_kw: 1699 case endswitch_kw:
1700 yylval.tok_val = new token (token::switch_end, l, c); 1700 tok_val = new token (token::switch_end, l, c);
1701 at_beginning_of_statement = true; 1701 at_beginning_of_statement = true;
1702 break; 1702 break;
1703 1703
1704 case endwhile_kw: 1704 case endwhile_kw:
1705 yylval.tok_val = new token (token::while_end, l, c); 1705 tok_val = new token (token::while_end, l, c);
1706 at_beginning_of_statement = true; 1706 at_beginning_of_statement = true;
1707 break; 1707 break;
1708 1708
1709 case endclassdef_kw: 1709 case endclassdef_kw:
1710 yylval.tok_val = new token (token::classdef_end, l, c); 1710 tok_val = new token (token::classdef_end, l, c);
1711 at_beginning_of_statement = true; 1711 at_beginning_of_statement = true;
1712 break; 1712 break;
1713 1713
1714 case endenumeration_kw: 1714 case endenumeration_kw:
1715 yylval.tok_val = new token (token::enumeration_end, l, c); 1715 tok_val = new token (token::enumeration_end, l, c);
1716 at_beginning_of_statement = true; 1716 at_beginning_of_statement = true;
1717 break; 1717 break;
1718 1718
1719 case endevents_kw: 1719 case endevents_kw:
1720 yylval.tok_val = new token (token::events_end, l, c); 1720 tok_val = new token (token::events_end, l, c);
1721 at_beginning_of_statement = true; 1721 at_beginning_of_statement = true;
1722 break; 1722 break;
1723 1723
1724 case endmethods_kw: 1724 case endmethods_kw:
1725 yylval.tok_val = new token (token::methods_end, l, c); 1725 tok_val = new token (token::methods_end, l, c);
1726 at_beginning_of_statement = true; 1726 at_beginning_of_statement = true;
1727 break; 1727 break;
1728 1728
1729 case endproperties_kw: 1729 case endproperties_kw:
1730 yylval.tok_val = new token (token::properties_end, l, c); 1730 tok_val = new token (token::properties_end, l, c);
1731 at_beginning_of_statement = true; 1731 at_beginning_of_statement = true;
1732 break; 1732 break;
1733 1733
1734 1734
1735 case for_kw: 1735 case for_kw:
1793 case magic_file_kw: 1793 case magic_file_kw:
1794 { 1794 {
1795 if ((reading_fcn_file || reading_script_file 1795 if ((reading_fcn_file || reading_script_file
1796 || reading_classdef_file) 1796 || reading_classdef_file)
1797 && ! curr_fcn_file_full_name.empty ()) 1797 && ! curr_fcn_file_full_name.empty ())
1798 yylval.tok_val = new token (curr_fcn_file_full_name, l, c); 1798 tok_val = new token (curr_fcn_file_full_name, l, c);
1799 else 1799 else
1800 yylval.tok_val = new token ("stdin", l, c); 1800 tok_val = new token ("stdin", l, c);
1801 } 1801 }
1802 break; 1802 break;
1803 1803
1804 case magic_line_kw: 1804 case magic_line_kw:
1805 yylval.tok_val = new token (static_cast<double> (l), "", l, c); 1805 tok_val = new token (static_cast<double> (l), "", l, c);
1806 break; 1806 break;
1807 1807
1808 default: 1808 default:
1809 panic_impossible (); 1809 panic_impossible ();
1810 } 1810 }
1811 1811
1812 if (! yylval.tok_val) 1812 if (! tok_val)
1813 yylval.tok_val = new token (l, c); 1813 tok_val = new token (l, c);
1814 1814
1815 token_stack.push (yylval.tok_val); 1815 curr_lexer->push_token (tok_val);
1816 1816
1817 return kw->tok; 1817 return kw->tok;
1818 } 1818 }
1819 1819
1820 return 0; 1820 return 0;
2499 quote_is_transpose = true; 2499 quote_is_transpose = true;
2500 convert_spaces_to_comma = true; 2500 convert_spaces_to_comma = true;
2501 looking_for_object_index = false; 2501 looking_for_object_index = false;
2502 at_beginning_of_statement = false; 2502 at_beginning_of_statement = false;
2503 2503
2504 yylval.tok_val = new token (value, yytext, input_line_number, 2504 curr_lexer->push_token (new token (value, yytext, input_line_number,
2505 current_input_column); 2505 current_input_column));
2506
2507 token_stack.push (yylval.tok_val);
2508 2506
2509 current_input_column += yyleng; 2507 current_input_column += yyleng;
2510 2508
2511 do_comma_insert_check (); 2509 do_comma_insert_check ();
2512 } 2510 }
2716 s = do_string_escapes (buf.str ()); 2714 s = do_string_escapes (buf.str ());
2717 2715
2718 quote_is_transpose = true; 2716 quote_is_transpose = true;
2719 convert_spaces_to_comma = true; 2717 convert_spaces_to_comma = true;
2720 2718
2721 yylval.tok_val = new token (s, bos_line, bos_col); 2719 curr_lexer->push_token (new token (s, bos_line, bos_col));
2722 token_stack.push (yylval.tok_val);
2723 2720
2724 if (delim == '"') 2721 if (delim == '"')
2725 gripe_matlab_incompatible ("\" used as string delimiter"); 2722 gripe_matlab_incompatible ("\" used as string delimiter");
2726 else if (delim == '\'') 2723 else if (delim == '\'')
2727 gripe_single_quote_string (); 2724 gripe_single_quote_string ();
3229 { 3226 {
3230 error ("method, class and package names may not be keywords"); 3227 error ("method, class and package names may not be keywords");
3231 return LEXICAL_ERROR; 3228 return LEXICAL_ERROR;
3232 } 3229 }
3233 3230
3234 yylval.tok_val 3231 curr_lexer->push_token
3235 = new token (meth.empty () ? 0 : &(symbol_table::insert (meth)), 3232 (new token (meth.empty () ? 0 : &(symbol_table::insert (meth)),
3236 cls.empty () ? 0 : &(symbol_table::insert (cls)), 3233 cls.empty () ? 0 : &(symbol_table::insert (cls)),
3237 pkg.empty () ? 0 : &(symbol_table::insert (pkg)), 3234 pkg.empty () ? 0 : &(symbol_table::insert (pkg)),
3238 input_line_number, 3235 input_line_number, current_input_column));
3239 current_input_column);
3240 token_stack.push (yylval.tok_val);
3241 3236
3242 convert_spaces_to_comma = true; 3237 convert_spaces_to_comma = true;
3243 current_input_column += yyleng; 3238 current_input_column += yyleng;
3244 3239
3245 return SUPERCLASSREF; 3240 return SUPERCLASSREF;
3265 { 3260 {
3266 error ("class and package names may not be keywords"); 3261 error ("class and package names may not be keywords");
3267 return LEXICAL_ERROR; 3262 return LEXICAL_ERROR;
3268 } 3263 }
3269 3264
3270 yylval.tok_val 3265 curr_lexer->push_token
3271 = new token (cls.empty () ? 0 : &(symbol_table::insert (cls)), 3266 (new token (cls.empty () ? 0 : &(symbol_table::insert (cls)),
3272 pkg.empty () ? 0 : &(symbol_table::insert (pkg)), 3267 pkg.empty () ? 0 : &(symbol_table::insert (pkg)),
3273 input_line_number, 3268 input_line_number, current_input_column));
3274 current_input_column);
3275
3276 token_stack.push (yylval.tok_val);
3277 3269
3278 convert_spaces_to_comma = true; 3270 convert_spaces_to_comma = true;
3279 current_input_column += yyleng; 3271 current_input_column += yyleng;
3280 3272
3281 return METAQUERY; 3273 return METAQUERY;
3307 { 3299 {
3308 do_comma_insert_check (); 3300 do_comma_insert_check ();
3309 3301
3310 maybe_unput_comma (spc_gobbled); 3302 maybe_unput_comma (spc_gobbled);
3311 3303
3312 yylval.tok_val = new token (tok, input_line_number, 3304 curr_lexer->push_token (new token (tok, input_line_number,
3313 current_input_column); 3305 current_input_column));
3314
3315 token_stack.push (yylval.tok_val);
3316 3306
3317 quote_is_transpose = true; 3307 quote_is_transpose = true;
3318 convert_spaces_to_comma = true; 3308 convert_spaces_to_comma = true;
3319 looking_for_object_index = true; 3309 looking_for_object_index = true;
3320 3310
3344 3334
3345 return LEXICAL_ERROR; 3335 return LEXICAL_ERROR;
3346 } 3336 }
3347 else 3337 else
3348 { 3338 {
3349 yylval.tok_val = new token (tok, input_line_number, 3339 curr_lexer->push_token (new token (tok, input_line_number,
3350 current_input_column); 3340 current_input_column));
3351
3352 token_stack.push (yylval.tok_val);
3353 3341
3354 current_input_column += yyleng; 3342 current_input_column += yyleng;
3355 quote_is_transpose = false; 3343 quote_is_transpose = false;
3356 convert_spaces_to_comma = true; 3344 convert_spaces_to_comma = true;
3357 looking_for_object_index = true; 3345 looking_for_object_index = true;
3427 // transformation of the end keyword... 3415 // transformation of the end keyword...
3428 3416
3429 if (tok == "end") 3417 if (tok == "end")
3430 tok = "__end__"; 3418 tok = "__end__";
3431 3419
3432 yylval.tok_val = new token (&(symbol_table::insert (tok)), 3420 curr_lexer->push_token (new token (&(symbol_table::insert (tok)),
3433 input_line_number, 3421 input_line_number, current_input_column));
3434 current_input_column);
3435
3436 token_stack.push (yylval.tok_val);
3437 3422
3438 // After seeing an identifer, it is ok to convert spaces to a comma 3423 // After seeing an identifer, it is ok to convert spaces to a comma
3439 // (if needed). 3424 // (if needed).
3440 3425
3441 convert_spaces_to_comma = true; 3426 convert_spaces_to_comma = true;
3521 std::string t = op; 3506 std::string t = op;
3522 int n = t.length (); 3507 int n = t.length ();
3523 if (t[n-1] == '\n') 3508 if (t[n-1] == '\n')
3524 t.resize (n-1); 3509 t.resize (n-1);
3525 gripe_matlab_incompatible (t + " used as operator"); 3510 gripe_matlab_incompatible (t + " used as operator");
3511 }
3512
3513 void
3514 lexical_feedback::push_token (token *tok)
3515 {
3516 yylval.tok_val = tok;
3517 token_stack.push (tok);
3518 }
3519
3520 token *
3521 lexical_feedback::current_token (void)
3522 {
3523 return yylval.tok_val;
3526 } 3524 }
3527 3525
3528 void 3526 void
3529 lexical_feedback::display_token (int tok) 3527 lexical_feedback::display_token (int tok)
3530 { 3528 {
3576 case POW: std::cerr << "POW\n"; break; 3574 case POW: std::cerr << "POW\n"; break;
3577 case EPOW: std::cerr << "EPOW\n"; break; 3575 case EPOW: std::cerr << "EPOW\n"; break;
3578 3576
3579 case NUM: 3577 case NUM:
3580 case IMAG_NUM: 3578 case IMAG_NUM:
3581 std::cerr << (tok == NUM ? "NUM" : "IMAG_NUM") 3579 {
3582 << " [" << yylval.tok_val->number () << "]\n"; 3580 token *tok_val = curr_lexer->current_token ();
3581 std::cerr << (tok == NUM ? "NUM" : "IMAG_NUM")
3582 << " [" << tok_val->number () << "]\n";
3583 }
3583 break; 3584 break;
3584 3585
3585 case STRUCT_ELT: 3586 case STRUCT_ELT:
3586 std::cerr << "STRUCT_ELT [" << yylval.tok_val->text () << "]\n"; break; 3587 {
3588 token *tok_val = curr_lexer->current_token ();
3589 std::cerr << "STRUCT_ELT [" << tok_val->text () << "]\n";
3590 }
3591 break;
3587 3592
3588 case NAME: 3593 case NAME:
3589 { 3594 {
3590 symbol_table::symbol_record *sr = yylval.tok_val->sym_rec (); 3595 token *tok_val = curr_lexer->current_token ();
3596 symbol_table::symbol_record *sr = tok_val->sym_rec ();
3591 std::cerr << "NAME"; 3597 std::cerr << "NAME";
3592 if (sr) 3598 if (sr)
3593 std::cerr << " [" << sr->name () << "]"; 3599 std::cerr << " [" << sr->name () << "]";
3594 std::cerr << "\n"; 3600 std::cerr << "\n";
3595 } 3601 }
3597 3603
3598 case END: std::cerr << "END\n"; break; 3604 case END: std::cerr << "END\n"; break;
3599 3605
3600 case DQ_STRING: 3606 case DQ_STRING:
3601 case SQ_STRING: 3607 case SQ_STRING:
3602 std::cerr << (tok == DQ_STRING ? "DQ_STRING" : "SQ_STRING") 3608 {
3603 << " [" << yylval.tok_val->text () << "]\n"; 3609 token *tok_val = curr_lexer->current_token ();
3610
3611 std::cerr << (tok == DQ_STRING ? "DQ_STRING" : "SQ_STRING")
3612 << " [" << tok_val->text () << "]\n";
3613 }
3604 break; 3614 break;
3605 3615
3606 case FOR: std::cerr << "FOR\n"; break; 3616 case FOR: std::cerr << "FOR\n"; break;
3607 case WHILE: std::cerr << "WHILE\n"; break; 3617 case WHILE: std::cerr << "WHILE\n"; break;
3608 case DO: std::cerr << "DO\n"; break; 3618 case DO: std::cerr << "DO\n"; break;