Mercurial > octave
changeset 27762:80d68a3e8ec0
make location info available for more tokens in parser
* oct-parse.yy: Use tok_val instead of dummy_type for single character
tokens '(' ')' '[' ']' '{' '}' '.' '@' ',' ';' '\n'. For now, tag all
as unused in the grammer.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 02 Dec 2019 01:16:12 -0600 |
parents | 223981108144 |
children | 4e6249815ea6 |
files | libinterp/parse-tree/oct-parse.yy |
diffstat | 1 files changed, 189 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy Fri Nov 29 15:42:34 2019 -0600 +++ b/libinterp/parse-tree/oct-parse.yy Mon Dec 02 01:16:12 2019 -0600 @@ -189,6 +189,8 @@ // Tokens with line and column information. %token <tok_val> '=' ':' '-' '+' '*' '/' +%token <tok_val> '(' ')' '[' ']' '{' '}' '.' '@' +%token <tok_val> ',' ';' '\n' %token <tok_val> ADD_EQ SUB_EQ MUL_EQ DIV_EQ LEFTDIV_EQ POW_EQ %token <tok_val> EMUL_EQ EDIV_EQ ELEFTDIV_EQ EPOW_EQ AND_EQ OR_EQ %token <tok_val> EXPR_AND_AND EXPR_OR_OR @@ -224,8 +226,6 @@ %token<dummy_type> INPUT_FILE // %token VARARGIN VARARGOUT -%token<dummy_type> '(' ')' '[' ']' '{' '}' '.' ',' ';' '@' '\n' - // Nonterminals we construct. %type <dummy_type> indirect_ref_op decl_param_init %type <dummy_type> push_fcn_symtab push_script_symtab begin_file @@ -382,6 +382,8 @@ input : simple_list '\n' { + YYUSE ($2); + $$ = nullptr; parser.statement_list (std::shared_ptr<octave::tree_statement_list> ($1)); YYACCEPT; @@ -543,13 +545,20 @@ ; matrix : '[' matrix_rows ']' - { $$ = parser.finish_matrix ($2); } + { + YYUSE ($1); + YYUSE ($3); + + $$ = parser.finish_matrix ($2); + } ; matrix_rows : cell_or_matrix_row { $$ = $1 ? new octave::tree_matrix ($1) : nullptr; } | matrix_rows ';' cell_or_matrix_row { + YYUSE ($2); + if ($1) { if ($3) @@ -563,13 +572,20 @@ ; cell : '{' cell_rows '}' - { $$ = parser.finish_cell ($2); } + { + YYUSE ($1); + YYUSE ($3); + + $$ = parser.finish_cell ($2); + } ; cell_rows : cell_or_matrix_row { $$ = $1 ? new octave::tree_cell ($1) : nullptr; } | cell_rows ';' cell_or_matrix_row { + YYUSE ($2); + if ($1) { if ($3) @@ -589,15 +605,32 @@ : // empty { $$ = nullptr; } | ',' - { $$ = nullptr; } + { + YYUSE ($1); + + $$ = nullptr; + } | arg_list { $$ = $1; } | arg_list ',' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } | ',' arg_list - { $$ = $2; } + { + YYUSE ($1); + + $$ = $2; + } | ',' arg_list ',' - { $$ = $2; } + { + YYUSE ($1); + YYUSE ($3); + + $$ = $2; + } ; fcn_handle : FCN_HANDLE @@ -610,6 +643,8 @@ anon_fcn_handle : '@' param_list anon_fcn_begin expression { + YYUSE ($1); + $$ = parser.make_anon_fcn_handle ($2, $4); if (! $$) { @@ -622,6 +657,7 @@ } | '@' param_list anon_fcn_begin error { + YYUSE ($1); YYUSE ($2); lexer.m_parsing_anon_fcn_body = false; @@ -650,7 +686,12 @@ | superclass_identifier { $$ = $1; } | '(' expression ')' - { $$ = $2->mark_in_parens (); } + { + YYUSE ($1); + YYUSE ($3); + + $$ = $2->mark_in_parens (); + } ; magic_colon : ':' @@ -678,16 +719,22 @@ { $$ = new octave::tree_argument_list ($1); } | arg_list ',' magic_colon { + YYUSE ($2); + $1->append ($3); $$ = $1; } | arg_list ',' magic_tilde { + YYUSE ($2); + $1->append ($3); $$ = $1; } | arg_list ',' expression { + YYUSE ($2); + $1->append ($3); $$ = $1; } @@ -695,6 +742,8 @@ indirect_ref_op : '.' { + YYUSE ($1); + $$ = 0; lexer.m_looking_at_indirect_ref = true; } @@ -708,6 +757,9 @@ { $$ = parser.make_postfix_op (MINUS_MINUS, $1, $2); } | oper_expr '(' ')' { + YYUSE ($2); + YYUSE ($3); + $$ = parser.make_index_expression ($1, nullptr, '('); if (! $$) { @@ -717,6 +769,9 @@ } | oper_expr '(' arg_list ')' { + YYUSE ($2); + YYUSE ($4); + $$ = parser.make_index_expression ($1, $3, '('); if (! $$) { @@ -726,6 +781,9 @@ } | oper_expr '{' '}' { + YYUSE ($2); + YYUSE ($3); + $$ = parser.make_index_expression ($1, nullptr, '{'); if (! $$) { @@ -735,6 +793,9 @@ } | oper_expr '{' arg_list '}' { + YYUSE ($2); + YYUSE ($4); + $$ = parser.make_index_expression ($1, $3, '{'); if (! $$) { @@ -749,7 +810,12 @@ | oper_expr indirect_ref_op STRUCT_ELT { $$ = parser.make_indirect_ref ($1, $3->text ()); } | oper_expr indirect_ref_op '(' expression ')' - { $$ = parser.make_indirect_ref ($1, $4); } + { + YYUSE ($3); + YYUSE ($5); + + $$ = parser.make_indirect_ref ($1, $4); + } | PLUS_PLUS oper_expr %prec UNARY { $$ = parser.make_prefix_op (PLUS_PLUS, $2, $1); } | MINUS_MINUS oper_expr %prec UNARY @@ -794,6 +860,9 @@ { $$ = parser.make_postfix_op (MINUS_MINUS, $1, $2); } | power_expr '(' ')' { + YYUSE ($2); + YYUSE ($3); + $$ = parser.make_index_expression ($1, nullptr, '('); if (! $$) { @@ -803,6 +872,9 @@ } | power_expr '(' arg_list ')' { + YYUSE ($2); + YYUSE ($4); + $$ = parser.make_index_expression ($1, $3, '('); if (! $$) { @@ -812,6 +884,9 @@ } | power_expr '{' '}' { + YYUSE ($2); + YYUSE ($3); + $$ = parser.make_index_expression ($1, nullptr, '{'); if (! $$) { @@ -821,6 +896,9 @@ } | power_expr '{' arg_list '}' { + YYUSE ($2); + YYUSE ($4); + $$ = parser.make_index_expression ($1, $3, '{'); if (! $$) { @@ -831,7 +909,12 @@ | power_expr indirect_ref_op STRUCT_ELT { $$ = parser.make_indirect_ref ($1, $3->text ()); } | power_expr indirect_ref_op '(' expression ')' - { $$ = parser.make_indirect_ref ($1, $4); } + { + YYUSE ($3); + YYUSE ($5); + + $$ = parser.make_indirect_ref ($1, $4); + } | PLUS_PLUS power_expr %prec POW { $$ = parser.make_prefix_op (PLUS_PLUS, $2, $1); } | MINUS_MINUS power_expr %prec POW @@ -1188,7 +1271,9 @@ } | FOR stash_comment '(' assign_lhs '=' expression ')' opt_sep opt_list END { + YYUSE ($3); YYUSE ($5); + YYUSE ($7); YYUSE ($8); if (! ($$ = parser.make_for_command (FOR, $1, $4, $6, @@ -1212,7 +1297,10 @@ } | PARFOR stash_comment '(' assign_lhs '=' expression ',' expression ')' opt_sep opt_list END { + YYUSE ($3); YYUSE ($5); + YYUSE ($7); + YYUSE ($9); YYUSE ($10); if (! ($$ = parser.make_for_command (PARFOR, $1, $4, $6, @@ -1304,6 +1392,8 @@ param_list_beg : '(' { + YYUSE ($1); + $$ = 0; lexer.m_looking_at_parameter_list = true; @@ -1319,6 +1409,8 @@ param_list_end : ')' { + YYUSE ($1); + $$ = 0; lexer.m_looking_at_parameter_list = false; lexer.m_looking_for_object_index = false; @@ -1369,6 +1461,8 @@ { $$ = new octave::tree_parameter_list ($1); } | param_list2 ',' param_list_elt { + YYUSE ($2); + $1->append ($3); $$ = $1; } @@ -1386,6 +1480,9 @@ return_list : '[' ']' { + YYUSE ($1); + YYUSE ($2); + lexer.m_looking_at_return_list = false; $$ = new octave::tree_parameter_list (); @@ -1410,6 +1507,9 @@ } | '[' return_list1 ']' { + YYUSE ($1); + YYUSE ($3); + lexer.m_looking_at_return_list = false; // Check for duplicate parameter names, varargin, @@ -1429,6 +1529,8 @@ { $$ = new octave::tree_parameter_list (new octave::tree_decl_elt ($1)); } | return_list1 ',' identifier { + YYUSE ($2); + $1->append (new octave::tree_decl_elt ($3)); $$ = $1; } @@ -1525,6 +1627,7 @@ | GET '.' identifier { YYUSE ($1); + YYUSE ($2); lexer.m_parsed_function_name.top () = true; lexer.m_maybe_classdef_get_set_method = false; @@ -1534,6 +1637,7 @@ | SET '.' identifier { YYUSE ($1); + YYUSE ($2); lexer.m_parsed_function_name.top () = true; lexer.m_maybe_classdef_get_set_method = false; @@ -1659,13 +1763,20 @@ opt_attr_list : // empty { $$ = nullptr; } | '(' attr_list ')' - { $$ = $2; } + { + YYUSE ($1); + YYUSE ($3); + + $$ = $2; + } ; attr_list : attr { $$ = new octave::tree_classdef_attribute_list ($1); } | attr_list ',' attr { + YYUSE ($2); + $1->append ($3); $$ = $1; } @@ -1969,7 +2080,12 @@ ; class_enum : identifier '(' expression ')' - { $$ = new octave::tree_classdef_enum ($1, $3); } + { + YYUSE ($2); + YYUSE ($4); + + $$ = new octave::tree_classdef_enum ($1, $3); + } ; // ============= @@ -2006,13 +2122,29 @@ ; sep_no_nl : ',' - { $$ = ','; } + { + YYUSE ($1); + + $$ = ','; + } | ';' - { $$ = ';'; } + { + YYUSE ($1); + + $$ = ';'; + } | sep_no_nl ',' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } | sep_no_nl ';' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } ; opt_sep_no_nl : // empty @@ -2028,23 +2160,55 @@ ; nl : '\n' - { $$ = '\n'; } + { + YYUSE ($1); + + $$ = '\n'; + } | nl '\n' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } ; sep : ',' - { $$ = ','; } + { + YYUSE ($1); + + $$ = ','; + } | ';' - { $$ = ';'; } + { + YYUSE ($1); + + $$ = ';'; + } | '\n' - { $$ = '\n'; } + { + YYUSE ($1); + + $$ = '\n'; + } | sep ',' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } | sep ';' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } | sep '\n' - { $$ = $1; } + { + YYUSE ($2); + + $$ = $1; + } ; opt_sep : // empty