diff libinterp/parse-tree/lex.ll @ 26709:17e7d310def8

revamp parsing of superclass identifiers in classdef decls This change is part of the fix for bug #47680. * lex.h, lex.ll (lexical_feedback::parsing_classdef_decl, lexical_feedback::parsing_classdef_superclass): New data members. (lexical_feedback::lexical_feedback): Initialize them. (lexical_feedback::reset): Reset them. (base_lexer::enable_fq_identifier): Delete. (base_lexer::handle_op_internal): Maybe FQ_IDENT_START start state when parsing classdef declaration. (base_lexer::display_start_state): Handle FQ_IDENT_START. Report INPUT_FILE_START for that state instead of INPUT_FILE_BEGIN. * oct-parse.yy (superclass_list): Eliminate mid-rule actions. (opt_superclass_list): Reset m_parsing_classdef_decl and m_parsing_classdef_superclass lexical feedback flags. (classdef_beg): Set m_parsing_classdef_decl lexical feedback flag.
author John W. Eaton <jwe@octave.org>
date Sat, 09 Feb 2019 16:14:01 +0000
parents 606605d0cd31
children d6dd07dce2d2
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.ll	Sat Feb 09 15:14:24 2019 +0000
+++ b/libinterp/parse-tree/lex.ll	Sat Feb 09 16:14:01 2019 +0000
@@ -2105,6 +2105,8 @@
     m_looking_at_indirect_ref = false;
     m_parsing_class_method = false;
     m_parsing_classdef = false;
+    m_parsing_classdef_decl = false;
+    m_parsing_classdef_superclass = false;
     m_maybe_classdef_get_set_method = false;
     m_parsing_classdef_get_method = false;
     m_parsing_classdef_set_method = false;
@@ -3487,7 +3489,7 @@
         break;
 
       case INPUT_FILE_START:
-        std::cerr << "INPUT_FILE_BEGIN" << std::endl;
+        std::cerr << "INPUT_FILE_START" << std::endl;
         break;
 
       case BLOCK_COMMENT_START:
@@ -3506,6 +3508,10 @@
         std::cerr << "SQ_STRING_START" << std::endl;
         break;
 
+      case FQ_IDENT_START:
+        std::cerr << "FQ_IDENT_START" << std::endl;
+        break;
+
       default:
         std::cerr << "UNKNOWN START STATE!" << std::endl;
         break;
@@ -3578,6 +3584,25 @@
     m_looking_for_object_index = false;
     m_at_beginning_of_statement = bos;
 
+    switch (tok)
+      {
+      case EXPR_LT:
+        if (m_parsing_classdef_decl)
+          {
+            m_parsing_classdef_superclass = true;
+            push_start_state (FQ_IDENT_START);
+          }
+        break;
+
+      case EXPR_AND:
+        if (m_parsing_classdef_superclass)
+          push_start_state (FQ_IDENT_START);
+        break;
+
+      default:
+        break;
+      }
+
     return count_token_internal (tok);
   }
 
@@ -3639,12 +3664,6 @@
     return tok;
   }
 
-  void
-  base_lexer::enable_fq_identifier (void)
-  {
-    push_start_state (FQ_IDENT_START);
-  }
-
   int
   lexer::fill_flex_buffer (char *buf, unsigned max_size)
   {