⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mismatched_token_exception.sa

📁 SRI international 发布的OAA框架软件
💻 SA
字号:
(* 

  ANTLR Translator Generator
  Project led by Terence Parr at http://www.jGuru.com
  Software rights: http://www.antlr.org/RIGHTS.html
 
  $Id: mismatched_token_exception.sa,v 1.1.1.1 2002/01/02 19:59:09 agno Exp $

*)

class ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST} < $ANTLR_RECOGNITION_EXCEPTION is

   include ANTLR_RECOGNITION_EXCEPTION 
	 str -> super_str,
	 message -> super_message;
   
   -- Types of tokens
   const TOKEN     : INT := 1;
   const NOT_TOKEN : INT := 2;
   const RANGE     : INT := 3;
   const NOT_RANGE : INT := 4;
   const SET       : INT := 5;
   const NOT_SET   : INT := 6;

   -- One of the above
   attr mismatch_type : INT;

   -- For TOKEN/NOT_TOKEN and RANGE/NOT_RANGE
   attr expecting : INT;

   -- For RANGE/NOT_RANGE (expecting is lower bound of range)
   attr upper : INT;

   -- For SET/NOT_SET
   attr set : INT_SET;

   -- Token names array for formatting 
   attr token_names : ARRAY{STR};

   -- The token that was encountered
   attr token : $ANTLR_TOKEN;

   -- The offending AST node if tree walking
   attr node : $ANTLR_AST{AST};

   -- taken from node or token object
   attr token_text : STR; 

   -- Looking for AST wildcard, didn't find it 
   create : SAME is
      res : SAME := #SAME("Mismatched Token: expecting any AST node");
      return res;
   end;

   -- Expected range / not range
   create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, lower : INT, upper : INT , match_not : BOOL ) : SAME is

      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.node := node;

      if ( void(node) ) then
	 res.token_text := "<empty tree>";
      else 
	 res.token_text := node.str;
      end;
      
      res.expecting := lower;
      res.upper := upper;
      res.file_name := "<AST>";
      
      if ( match_not ) then
	 res.mismatch_type := NOT_RANGE;
      else 
	 res.mismatch_type := RANGE;
      end;

      return res;
      
   end;

   -- Expected token / not token
   create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, expecting : INT, match_not : BOOL ) : SAME is

      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.node := node;

      if ( void(node) ) then
	 res.token_text := "<empty tree>";
      else 
	 res.token_text := node.str;
      end;
      
      res.expecting := expecting;
      res.file_name := "<AST>";
      
      if ( match_not ) then
	 res.mismatch_type := NOT_RANGE;
      else 
	 res.mismatch_type := RANGE;
      end;

      return res;

   end;
   
   -- Expected INT_SET / not INT_SET
   create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, set : INT_SET, match_not : BOOL ) : SAME is 

      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.node := node;
      res.token_names := token_names;

      if ( void(node) ) then
	 res.token_text := "<empty tree>";
      else 
	 res.token_text := node.str;
      end;
      
      res.set := set;
      res.file_name := "<AST>"; 
      
      if ( match_not ) then
	 res.mismatch_type := NOT_SET;
      else 
	 res.mismatch_type := SET;
      end;

      return res;

   end;

   -- Expected range / not range
   create_from_token(
		     token_names : ARRAY{STR}, 
		     token       : $ANTLR_TOKEN, 
		     lower       : INT, 
		     upper       : INT, 
		     match_not   : BOOL,
		     file        : STR           ) : SAME is
		     
      
      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.token := token;
      res.line := token.line;
      res.column := token.column;
      res.token_text := token.text;
      res.expecting := lower;
      res.upper := upper;
      res.file_name := file;
	    
      if ( match_not ) then
	 res.mismatch_type := NOT_RANGE;
      else 
	 res.mismatch_type := RANGE;
      end;

      return res;
   end;

   -- Expected token / not token
   create_from_token ( 
		      token_names : ARRAY{STR}, 
		      token       : $ANTLR_TOKEN, 
		      expecting   : INT, 
		      match_not   : BOOL,
		      file        : STR           ) : SAME is

      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.token := token;
      res.line := token.line;
      res.column := token.column;
      res.token_text := token.text;
      res.expecting := expecting;
      res.file_name := file;
      
      if ( match_not ) then
	 res.mismatch_type := NOT_TOKEN;
      else 
	 res.mismatch_type := TOKEN;
      end;

      return res;
      
   end;

   -- Expected INT_SET / not INT_SET
   create_from_token ( 
		      token_names : ARRAY{STR}, 
		      token       : $ANTLR_TOKEN, 
		      set         : INT_SET, 
		      match_not   : BOOL,
		      file        : STR           ) : SAME is

      res : SAME := #SAME("Mismatched Token");
      res.token_names := token_names;
      res.token := token;
      res.line := token.line;
      res.column := token.column;
      res.token_text := token.text;
      res.set := set;
      res.file_name := file;
      
      if ( match_not ) then
	 res.mismatch_type := NOT_SET;
      else 
	 res.mismatch_type := SET;
      end;

      return res;

   end;

   -- Returns the error message that happened on the line/col given.
   -- Copied from str.
   message : STR is 

      sb : STR;

      case ( mismatch_type ) 
      when TOKEN then
	 sb := "expecting " + token_name(expecting) + ", found '" + token_text + "'";
      when NOT_TOKEN then
	 sb := "expecting anything but " + token_name(expecting) + "; got it anyway";
      when RANGE then
	 sb := "expecting token in range: " + token_name(expecting) + ".." + token_name(upper) 
	    + ", found '" + token_text + "'";
      when NOT_RANGE then
	 sb := "expecting token NOT in range: " + token_name(expecting) + ".." + token_name(upper) 
	       + ", found '" + token_text + "'";
      when SET , NOT_SET then
	 sb := "expecting "; 
	 if ( mismatch_type = NOT_SET ) then
	    sb := sb + "NOT "; 
	 end;
	 sb := sb + "one of (";

	 loop
	    sb := sb + " " + token_name( set.elt! );
	 end;

	 sb := sb + "), found '" + token_text + "'";

      else
	 sb := sb + super_str;
      end;
      return sb.str;
   end;

   (*
   -- return the column number that this exception happened on.
   column : INT is
      return token.column;
   end;
	 
   -- return the line number that this exception happened on.
   line : INT is 
      return token.line; 
   end;
   *)
   
   private token_name( token_type : INT ) : STR is
      if ( token_type = ANTLR_COMMON_TOKEN::INVALID_TYPE ) then
	 return "<Set of tokens>";
      elsif ( token_type < 0 or token_type >= token_names.size ) then
	 return "<" + token_type + ">";
      else 
	 return token_names[token_type];
      end;
   end;

   -- return a string representation of this exception.
   str : STR is
      if ( ~void(token) ) then -- AST or Token?
	 return file_line_str + message;
      else
	 return message;
      end;
   end;

end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -