Mercurial > octave
changeset 31478:ef9c804676b9 stable
don't accept '!' to indicate ignored function parameters
* lex.ll ("~", "!", lexical_feedback::previous_token_is_binop,
base_lexer::display_token): Use separate '~' and '!' tokens instead of
recognizing both as EXPR_NOT.
* oct-parse.yy: Adjust list of tokens and precedence list in parser.
(magic_tilde): Accept only '~', not EXPR_NOT.
(oper_expr, power_expr, attr, base_parser::make_prefix_op):
Handle '~' and '!' tokens separately.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 18 Nov 2022 23:49:32 -0500 |
parents | 77072a5e99a5 |
children | ef7418c5df8a |
files | libinterp/parse-tree/lex.ll libinterp/parse-tree/oct-parse.yy |
diffstat | 2 files changed, 27 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.ll Fri Nov 18 14:48:22 2022 -0800 +++ b/libinterp/parse-tree/lex.ll Fri Nov 18 23:49:32 2022 -0500 @@ -1697,8 +1697,8 @@ "+" { CMD_OR_UNARY_OP ("+", '+', true); } "-" { CMD_OR_UNARY_OP ("-", '-', true); } -"~" { CMD_OR_UNARY_OP ("~", EXPR_NOT, true); } -"!" { CMD_OR_UNARY_OP ("!", EXPR_NOT, false); } +"~" { CMD_OR_UNARY_OP ("~", '~', true); } +"!" { CMD_OR_UNARY_OP ("!", '!', false); } "," { curr_lexer->lexer_debug (","); @@ -2318,7 +2318,7 @@ { int tok = previous_token_value (); - return (tok == '+' || tok == '-' || tok == '@' + return (tok == '+' || tok == '-' || tok == '@' || tok == '~' || tok == '!' || tok == ',' || tok == ';' || tok == '*' || tok == '/' || tok == ':' || tok == '=' || tok == ADD_EQ || tok == AND_EQ || tok == DIV_EQ || tok == EDIV @@ -2327,7 +2327,7 @@ || tok == EPOW || tok == EPOW_EQ || tok == EXPR_AND || tok == EXPR_AND_AND || tok == EXPR_EQ || tok == EXPR_GE || tok == EXPR_GT || tok == EXPR_LE || tok == EXPR_LT - || tok == EXPR_NE || tok == EXPR_NOT || tok == EXPR_OR + || tok == EXPR_NE || tok == EXPR_OR || tok == EXPR_OR_OR || tok == LEFTDIV || tok == LEFTDIV_EQ || tok == MUL_EQ || tok == OR_EQ || tok == POW || tok == POW_EQ || tok == SUB_EQ); @@ -3723,6 +3723,8 @@ case '+': std::cerr << "'+'\n"; break; case '*': std::cerr << "'*'\n"; break; case '/': std::cerr << "'/'\n"; break; + case '~': std::cerr << "'~'\n"; break; + case '!': std::cerr << "'!'\n"; break; case ADD_EQ: std::cerr << "ADD_EQ\n"; break; case SUB_EQ: std::cerr << "SUB_EQ\n"; break; case MUL_EQ: std::cerr << "MUL_EQ\n"; break; @@ -3739,7 +3741,6 @@ case EXPR_OR_OR: std::cerr << "EXPR_OR_OR\n"; break; case EXPR_AND: std::cerr << "EXPR_AND\n"; break; case EXPR_OR: std::cerr << "EXPR_OR\n"; break; - case EXPR_NOT: std::cerr << "EXPR_NOT\n"; break; case EXPR_LT: std::cerr << "EXPR_LT\n"; break; case EXPR_LE: std::cerr << "EXPR_LE\n"; break; case EXPR_EQ: std::cerr << "EXPR_EQ\n"; break;
--- a/libinterp/parse-tree/oct-parse.yy Fri Nov 18 14:48:22 2022 -0800 +++ b/libinterp/parse-tree/oct-parse.yy Fri Nov 18 23:49:32 2022 -0500 @@ -202,13 +202,13 @@ } // Tokens with line and column information. -%token <tok_val> '=' ':' '-' '+' '*' '/' +%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 -%token <tok_val> EXPR_AND EXPR_OR EXPR_NOT +%token <tok_val> EXPR_AND EXPR_OR %token <tok_val> EXPR_LT EXPR_LE EXPR_EQ EXPR_NE EXPR_GE EXPR_GT %token <tok_val> LEFTDIV EMUL EDIV ELEFTDIV %token <tok_val> HERMITIAN TRANSPOSE @@ -325,7 +325,7 @@ %left ':' %left '-' '+' %left '*' '/' LEFTDIV EMUL EDIV ELEFTDIV -%right UNARY EXPR_NOT +%right UNARY '~' '!' %left POW EPOW HERMITIAN TRANSPOSE %right PLUS_PLUS MINUS_MINUS %left '(' '.' '{' @@ -689,7 +689,7 @@ { $$ = parser.make_constant ($1); } ; -magic_tilde : EXPR_NOT +magic_tilde : '~' { OCTAVE_YYUSE ($1); @@ -798,8 +798,10 @@ { $$ = parser.make_prefix_op (PLUS_PLUS, $2, $1); } | MINUS_MINUS oper_expr %prec UNARY { $$ = parser.make_prefix_op (MINUS_MINUS, $2, $1); } - | EXPR_NOT oper_expr %prec UNARY - { $$ = parser.make_prefix_op (EXPR_NOT, $2, $1); } + | '~' oper_expr %prec UNARY + { $$ = parser.make_prefix_op ('~', $2, $1); } + | '!' oper_expr %prec UNARY + { $$ = parser.make_prefix_op ('!', $2, $1); } | '+' oper_expr %prec UNARY { $$ = parser.make_prefix_op ('+', $2, $1); } | '-' oper_expr %prec UNARY @@ -888,8 +890,10 @@ { $$ = parser.make_prefix_op (PLUS_PLUS, $2, $1); } | MINUS_MINUS power_expr %prec POW { $$ = parser.make_prefix_op (MINUS_MINUS, $2, $1); } - | EXPR_NOT power_expr %prec POW - { $$ = parser.make_prefix_op (EXPR_NOT, $2, $1); } + | '~' power_expr %prec POW + { $$ = parser.make_prefix_op ('~', $2, $1); } + | '!' power_expr %prec POW + { $$ = parser.make_prefix_op ('!', $2, $1); } | '+' power_expr %prec POW { $$ = parser.make_prefix_op ('+', $2, $1); } | '-' power_expr %prec POW @@ -1887,7 +1891,13 @@ $$ = parser.make_classdef_attribute ($1, $3); } - | EXPR_NOT identifier + | '~' identifier + { + OCTAVE_YYUSE ($1); + + $$ = parser.make_not_classdef_attribute ($2); + } + | '!' identifier { OCTAVE_YYUSE ($1); @@ -3209,7 +3219,8 @@ switch (op) { - case EXPR_NOT: + case '~': + case '!': t = octave_value::op_not; break;