mismatched_token_exception.sa
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:7k
源码类别:

编译器/解释器

开发平台:

Others

  1. (* 
  2.   ANTLR Translator Generator
  3.   Project led by Terence Parr at http://www.jGuru.com
  4.   Software rights: http://www.antlr.org/RIGHTS.html
  5.  
  6.   $Id: //depot/code/org.antlr/release/antlr-2.7.0/lib/sather/Antlr/mismatched_token_exception.sa#1 $
  7. *)
  8. class ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST} < $ANTLR_RECOGNITION_EXCEPTION is
  9.    include ANTLR_RECOGNITION_EXCEPTION 
  10.  str -> super_str,
  11.  message -> super_message;
  12.    
  13.    -- Types of tokens
  14.    const TOKEN     : INT := 1;
  15.    const NOT_TOKEN : INT := 2;
  16.    const RANGE     : INT := 3;
  17.    const NOT_RANGE : INT := 4;
  18.    const SET       : INT := 5;
  19.    const NOT_SET   : INT := 6;
  20.    -- One of the above
  21.    attr mismatch_type : INT;
  22.    -- For TOKEN/NOT_TOKEN and RANGE/NOT_RANGE
  23.    attr expecting : INT;
  24.    -- For RANGE/NOT_RANGE (expecting is lower bound of range)
  25.    attr upper : INT;
  26.    -- For SET/NOT_SET
  27.    attr set : INT_SET;
  28.    -- Token names array for formatting 
  29.    attr token_names : ARRAY{STR};
  30.    -- The token that was encountered
  31.    attr token : $ANTLR_TOKEN;
  32.    -- The offending AST node if tree walking
  33.    attr node : $ANTLR_AST{AST};
  34.    -- taken from node or token object
  35.    attr token_text : STR; 
  36.    -- Looking for AST wildcard, didn't find it 
  37.    create : SAME is
  38.       res : SAME := #SAME("Mismatched Token: expecting any AST node");
  39.       return res;
  40.    end;
  41.    -- Expected range / not range
  42.    create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, lower : INT, upper : INT , match_not : BOOL ) : SAME is
  43.       res : SAME := #SAME("Mismatched Token");
  44.       res.token_names := token_names;
  45.       res.node := node;
  46.       if ( void(node) ) then
  47.  res.token_text := "<empty tree>";
  48.       else 
  49.  res.token_text := node.str;
  50.       end;
  51.       
  52.       res.expecting := lower;
  53.       res.upper := upper;
  54.       res.file_name := "<AST>";
  55.       
  56.       if ( match_not ) then
  57.  res.mismatch_type := NOT_RANGE;
  58.       else 
  59.  res.mismatch_type := RANGE;
  60.       end;
  61.       return res;
  62.       
  63.    end;
  64.    -- Expected token / not token
  65.    create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, expecting : INT, match_not : BOOL ) : SAME is
  66.       res : SAME := #SAME("Mismatched Token");
  67.       res.token_names := token_names;
  68.       res.node := node;
  69.       if ( void(node) ) then
  70.  res.token_text := "<empty tree>";
  71.       else 
  72.  res.token_text := node.str;
  73.       end;
  74.       
  75.       res.expecting := expecting;
  76.       res.file_name := "<AST>";
  77.       
  78.       if ( match_not ) then
  79.  res.mismatch_type := NOT_RANGE;
  80.       else 
  81.  res.mismatch_type := RANGE;
  82.       end;
  83.       return res;
  84.    end;
  85.    
  86.    -- Expected INT_SET / not INT_SET
  87.    create( token_names : ARRAY{STR}, node : $ANTLR_AST{AST}, set : INT_SET, match_not : BOOL ) : SAME is 
  88.       res : SAME := #SAME("Mismatched Token");
  89.       res.token_names := token_names;
  90.       res.node := node;
  91.       res.token_names := token_names;
  92.       if ( void(node) ) then
  93.  res.token_text := "<empty tree>";
  94.       else 
  95.  res.token_text := node.str;
  96.       end;
  97.       
  98.       res.set := set;
  99.       res.file_name := "<AST>"; 
  100.       
  101.       if ( match_not ) then
  102.  res.mismatch_type := NOT_SET;
  103.       else 
  104.  res.mismatch_type := SET;
  105.       end;
  106.       return res;
  107.    end;
  108.    -- Expected range / not range
  109.    create_from_token(
  110.      token_names : ARRAY{STR}, 
  111.      token       : $ANTLR_TOKEN, 
  112.      lower       : INT, 
  113.      upper       : INT, 
  114.      match_not   : BOOL,
  115.      file        : STR           ) : SAME is
  116.      
  117.       
  118.       res : SAME := #SAME("Mismatched Token");
  119.       res.token_names := token_names;
  120.       res.token := token;
  121.       res.line := token.line;
  122.       res.column := token.column;
  123.       res.token_text := token.text;
  124.       res.expecting := lower;
  125.       res.upper := upper;
  126.       res.file_name := file;
  127.     
  128.       if ( match_not ) then
  129.  res.mismatch_type := NOT_RANGE;
  130.       else 
  131.  res.mismatch_type := RANGE;
  132.       end;
  133.       return res;
  134.    end;
  135.    -- Expected token / not token
  136.    create_from_token ( 
  137.       token_names : ARRAY{STR}, 
  138.       token       : $ANTLR_TOKEN, 
  139.       expecting   : INT, 
  140.       match_not   : BOOL,
  141.       file        : STR           ) : SAME is
  142.       res : SAME := #SAME("Mismatched Token");
  143.       res.token_names := token_names;
  144.       res.token := token;
  145.       res.line := token.line;
  146.       res.column := token.column;
  147.       res.token_text := token.text;
  148.       res.expecting := expecting;
  149.       res.file_name := file;
  150.       
  151.       if ( match_not ) then
  152.  res.mismatch_type := NOT_TOKEN;
  153.       else 
  154.  res.mismatch_type := TOKEN;
  155.       end;
  156.       return res;
  157.       
  158.    end;
  159.    -- Expected INT_SET / not INT_SET
  160.    create_from_token ( 
  161.       token_names : ARRAY{STR}, 
  162.       token       : $ANTLR_TOKEN, 
  163.       set         : INT_SET, 
  164.       match_not   : BOOL,
  165.       file        : STR           ) : SAME is
  166.       res : SAME := #SAME("Mismatched Token");
  167.       res.token_names := token_names;
  168.       res.token := token;
  169.       res.line := token.line;
  170.       res.column := token.column;
  171.       res.token_text := token.text;
  172.       res.set := set;
  173.       res.file_name := file;
  174.       
  175.       if ( match_not ) then
  176.  res.mismatch_type := NOT_SET;
  177.       else 
  178.  res.mismatch_type := SET;
  179.       end;
  180.       return res;
  181.    end;
  182.    -- Returns the error message that happened on the line/col given.
  183.    -- Copied from str.
  184.    message : STR is 
  185.       sb : STR;
  186.       case ( mismatch_type ) 
  187.       when TOKEN then
  188.  sb := "expecting " + token_name(expecting) + ", found '" + token_text + "'";
  189.       when NOT_TOKEN then
  190.  sb := "expecting anything but " + token_name(expecting) + "; got it anyway";
  191.       when RANGE then
  192.  sb := "expecting token in range: " + token_name(expecting) + ".." + token_name(upper) 
  193.     + ", found '" + token_text + "'";
  194.       when NOT_RANGE then
  195.  sb := "expecting token NOT in range: " + token_name(expecting) + ".." + token_name(upper) 
  196.        + ", found '" + token_text + "'";
  197.       when SET , NOT_SET then
  198.  sb := "expecting "; 
  199.  if ( mismatch_type = NOT_SET ) then
  200.     sb := sb + "NOT "; 
  201.  end;
  202.  sb := sb + "one of (";
  203.  loop
  204.     sb := sb + " " + token_name( set.elt! );
  205.  end;
  206.  sb := sb + "), found '" + token_text + "'";
  207.       else
  208.  sb := sb + super_str;
  209.       end;
  210.       return sb.str;
  211.    end;
  212.    (*
  213.    -- return the column number that this exception happened on.
  214.    column : INT is
  215.       return token.column;
  216.    end;
  217.  
  218.    -- return the line number that this exception happened on.
  219.    line : INT is 
  220.       return token.line; 
  221.    end;
  222.    *)
  223.    
  224.    private token_name( token_type : INT ) : STR is
  225.       if ( token_type = ANTLR_COMMON_TOKEN::INVALID_TYPE ) then
  226.  return "<Set of tokens>";
  227.       elsif ( token_type < 0 or token_type >= token_names.size ) then
  228.  return "<" + token_type + ">";
  229.       else 
  230.  return token_names[token_type];
  231.       end;
  232.    end;
  233.    -- return a string representation of this exception.
  234.    str : STR is
  235.       if ( ~void(token) ) then -- AST or Token?
  236.  return file_line_str + message;
  237.       else
  238.  return message;
  239.       end;
  240.    end;
  241. end;