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;