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

编译器/解释器

开发平台:

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_char_exception.sa#1 $
  7. *)
  8. class ANTLR_MISMATCHED_CHAR_EXCEPTION < $ANTLR_RECOGNITION_EXCEPTION is
  9.    include ANTLR_RECOGNITION_EXCEPTION 
  10.  message -> super_message;
  11.    
  12.    -- Types of tokens
  13.    const CHAR      : INT := 1; -- will CHAR confilict with class CHAR? hmm...
  14.    const NOT_CHAR  : INT := 2;
  15.    const RANGE     : INT := 3;
  16.    const NOT_RANGE : INT := 4;
  17.    const SET       : INT := 5;
  18.    const NOT_SET   : INT := 6;
  19.    -- One of the above
  20.    attr mismatch_type : INT;
  21.    -- For CHAR/NOT_CHAR and RANGE/NOT_RANGE
  22.    attr expecting : CHAR;
  23.    -- For RANGE/NOT_RANGE (expecting is lower bound of range)
  24.    attr upper : CHAR;
  25.    -- For SET/NOT_SET
  26.    attr set : CHAR_SET;
  27.    -- what was found on the input stream
  28.    attr found_char : CHAR;
  29.    -- who knows...they may want to ask scanner questions
  30.    attr scanner : $ANTLR_FILE_CURSOR;
  31.    -- Expected range / not range
  32.    create( c        : CHAR, 
  33.   lower     : CHAR, 
  34.   upper_    : CHAR, 
  35.   match_not : BOOL, 
  36.   scanner_  : $ANTLR_FILE_CURSOR ) : SAME is
  37.       res : SAME := #SAME("Mismatched char");
  38.       res.found_char := c;
  39.       res.expecting := lower;
  40.       res.upper := upper_;
  41.       -- get instantaneous values of file/line/column
  42.       res.line := scanner_.line;
  43.       res.file_name := scanner_.file_name;
  44.       res.column := scanner_.column;
  45.       res.scanner := scanner_;
  46.       if ( match_not ) then
  47.  res.mismatch_type := NOT_RANGE;
  48.       else 
  49.  res.mismatch_type := RANGE;
  50.       end;
  51.       return res;
  52.    end;
  53.    -- Expected char / not char
  54.    create ( c         : CHAR, 
  55.    expecting_ : CHAR, 
  56.    match_not  : BOOL, 
  57.    scanner_   : $ANTLR_FILE_CURSOR ) : SAME is
  58.       
  59.       res : SAME := #SAME("Mismatched char");
  60.       res.found_char := c;
  61.       res.expecting := expecting_;
  62.       -- get instantaneous values of file/line/column
  63.       res.line := scanner_.line;
  64.       res.file_name := scanner_.file_name;
  65.       res.column := scanner_.column;
  66.       res.scanner := scanner_;
  67.       if ( match_not ) then
  68.  res.mismatch_type := NOT_CHAR;
  69.       else 
  70.  res.mismatch_type := CHAR;
  71.       end;
  72.       return res;
  73.    end;
  74.    
  75.    -- Expected CHAR_SET / not CHAR_SET
  76.    create ( c        : CHAR, 
  77.    set_      : CHAR_SET, 
  78.    match_not : BOOL, 
  79.    scanner_  : $ANTLR_FILE_CURSOR ) : SAME is
  80.       res ::= #SAME("Mismatched char");
  81.       res.found_char := c;
  82.       res.set := set_;
  83.       -- get instantaneous values of file/line/column
  84.       res.line := scanner_.line;
  85.       res.file_name := scanner_.file_name;
  86.       res.column := scanner_.column;
  87.       res.scanner := scanner_;
  88.       if ( match_not ) then
  89.  res.mismatch_type := NOT_SET;
  90.       else 
  91.  res.mismatch_type := SET;
  92.       end;
  93.       return res;
  94.    end;
  95.    -- Returns the error message that happened on the line/col given.
  96.    -- Copied from str:STR.
  97.    message : STR is
  98.       sb : STR;
  99.       case ( mismatch_type ) 
  100.       when CHAR then
  101.  sb := "expecting '" + expecting + "', found '" + found_char + "'";
  102.       when NOT_CHAR then
  103.  sb := "expecting anything but '" + expecting + "'; got it anyway";
  104.       when RANGE then
  105.  sb := "expecting token in range: '" + expecting + "'..'" + upper + "', found '" + found_char + "'";
  106.       when NOT_RANGE then
  107.  sb := "expecting token NOT in range: " + expecting + "'..'" + upper + "', found '" + found_char + "'";
  108.       when SET, NOT_SET then
  109.  sb := "expecting "; 
  110.  if ( mismatch_type = NOT_SET ) then
  111.     sb := sb + "NOT "; 
  112.  end;
  113.  sb := sb + "one of (";
  114.  loop
  115.     sb := sb + " '" + set.elt! + "'";
  116.  end;
  117.  sb := sb + "), found '" + found_char + "'";
  118.       else
  119.  sb := sb + super_message;
  120.       end;
  121.       
  122.       return sb;
  123.    end;
  124. end;