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

编译器/解释器

开发平台:

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/char_scanner.sa#1 $
  7. *)
  8. abstract class $ANTLR_FILE_CURSOR is
  9.    file_name : STR;
  10.    column : INT;
  11.    line : INT;
  12. end;
  13. class ANTLR_CHAR_SCANNER{ TOKEN < $ANTLR_TOKEN } < $ANTLR_FILE_CURSOR is
  14.    readonly attr text : STR; -- text of current token
  15.    attr save_consumed_input : BOOL; -- does consume save characters?
  16.    attr guessing : INT;
  17.    readonly attr case_sensitive : BOOL;
  18.    readonly attr case_sensitive_literals : BOOL;
  19.    readonly attr commit_to_path : BOOL;
  20.    readonly attr sa_return_token : TOKEN;
  21.    attr literals : MAP{STR,INT};
  22.    attr char_set : CHAR_SET;
  23.    attr input_state : ANTLR_LEXER_SHARED_INPUT_STATE;
  24.    attr EOF_CHAR : CHAR;
  25.    private init : SAME is
  26.       res : SAME := new;
  27.       res.guessing := 0;
  28.       res.case_sensitive := true;
  29.       res.case_sensitive_literals := true;
  30.       res.commit_to_path := false;
  31.       res.save_consumed_input := true;
  32.       res.EOF_CHAR := '377';
  33.       return res;
  34.    end;
  35.    create( state : ANTLR_LEXER_SHARED_INPUT_STATE ) : SAME is
  36.       res : SAME := init;
  37.       res.input_state := state;
  38.       return res;
  39.    end;
  40.    append ( c : CHAR ) is
  41.       if save_consumed_input
  42.       then
  43.  text := text + c;
  44.       end;
  45.    end;
  46.    append ( s : STR ) is
  47.       if save_consumed_input
  48.       then
  49.  text := text + s;
  50.       end;
  51.    end;
  52.    commit is
  53.       input_state.input.commit;
  54.    end;
  55.    LA ( i : INT ) : CHAR is
  56.       if case_sensitive 
  57.       then
  58.  return input_state.input.LA(i);
  59.       else
  60.  return input_state.input.LA(i).lower;
  61.       end;
  62.    end;
  63.    consume is
  64.       if input_state.guessing = 0
  65.       then
  66.  if case_sensitive
  67.  then
  68.     append( LA(1) );
  69.  else
  70.     append( input_state.input.LA(1) );
  71.  end;
  72.       end;
  73.       input_state.input.consume;
  74.    end;
  75.    consume_until ( c: CHAR ) is
  76.       loop while! ( LA(1) /= IFSTREAM::eof_char and LA(1) /= c );
  77.  consume;
  78.       end;
  79.    end;
  80.    consume_until ( set: CHAR_SET ) 
  81.       pre ~void(set) is
  82.       loop while! ( LA(1) /= IFSTREAM::eof_char and 
  83.    ~set.member( LA(1) ) );
  84.  consume;
  85.       end;
  86.    end;
  87.    byte_buffer : ANTLR_BYTE_BUFFER is 
  88.       return input_state.input;
  89.    end;
  90.    
  91.    make_token ( t : INT ) : TOKEN is
  92.       res ::= #TOKEN;
  93.       res.ttype( t );
  94.       res.line( line );
  95.       return res;
  96.    end;
  97.    mark : INT is
  98.       return input_state.input.mark;
  99.    end;
  100.    match ( c: CHAR ) is
  101.       if ( LA(1) /= c ) then
  102.  raise #ANTLR_MISMATCHED_CHAR_EXCEPTION( LA(1), c, false, self );
  103.       end;
  104.       consume;
  105.    end;
  106.    match ( b : CHAR_SET ) 
  107.       pre ~void(b) is
  108.       if ( ~b.member( LA(1) ) ) then
  109.  raise #ANTLR_MISMATCHED_CHAR_EXCEPTION( LA(1), b, false, self );
  110.       else
  111.          consume;
  112.       end;
  113.    end;
  114.    match ( s : STR ) 
  115.       pre ~void(b) is
  116.       len : INT := s.length;
  117.       loop 
  118.  si ::= s.elt!;
  119.  if ( LA(1) /= si ) then
  120.     raise #ANTLR_MISMATCHED_CHAR_EXCEPTION( LA(1), si, false, self );
  121.  end;
  122.  consume;
  123.       end;
  124.    end;
  125.    match_not ( c : CHAR ) is
  126.       if ( LA(1) = c ) then
  127.  raise #ANTLR_MISMATCHED_CHAR_EXCEPTION( LA(1), c, true, self );
  128.       end;      
  129.       consume;
  130.    end;
  131.    match_range ( c1 : CHAR, c2 : CHAR ) is
  132.       if ( LA(1) < c1 or LA(1) > c2 ) then
  133.  raise #ANTLR_MISMATCHED_CHAR_EXCEPTION( LA(1), c1, c2, false, self );
  134.       end;
  135.       consume;
  136.    end;
  137.    newline is
  138.       input_state.line := input_state.line + 1;
  139.    end;
  140.    panic is
  141.       #ERR + "ANTLR_CHAR_SCANNER: panic";
  142.       UNIX::exit(1);
  143.    end;
  144.    panic ( s: STR ) is
  145.       #ERR + "ANTLR_CHAR_SCANNER: panic" + s;
  146.       UNIX::exit(1);
  147.    end;
  148.    report_error ( e : $ANTLR_RECOGNITION_EXCEPTION ) 
  149.       pre ~void(e) is 
  150.       #ERR + e.str + 'n';
  151.    end;
  152.    report_error ( s : STR ) is 
  153.       if ( void(file_name) ) then
  154.  #ERR + "error: " + s + 'n';
  155.       else
  156.  #ERR + file_name + ": error: " + s + 'n';
  157.       end;
  158.    end;
  159.    report_warning ( s: STR ) is
  160.       if ( void(file_name) ) then
  161.  #ERR + "warning: " + s + 'n';
  162.       else
  163.  #ERR + file_name + ": warning: " + s + 'n';
  164.       end;
  165.    end;
  166.    reset_text is
  167.       text := "";
  168.    end;
  169.    rewind ( pos : INT ) 
  170.       pre ~void(input) is
  171.       input_state.input.rewind( pos );
  172.    end;  
  173.    test_literals_table ( ttype : INT ) : INT is 
  174.       if ( literals.has_ind( text ) ) then
  175.  -- would be nice if we could test membership of text and get its associated
  176.  -- value with one call a la C++/STL's map
  177.  return literals[ text ]; 
  178.       end;
  179.       return ttype;
  180.    end;
  181.    -- Test the text passed in against the literals table
  182.    -- Override this method to perform a different literals test
  183.    -- This is used primarily when you want to test a portion of
  184.    -- a token.
  185.    test_literals_table( txt : STR, ttype : INT ) : INT is
  186.       if ( literals.has_ind( txt ) ) then
  187.  return literals[ txt ]; 
  188.       end;
  189.       return ttype;
  190.    end;
  191.    
  192.    trace_in ( rname : STR ) is 
  193.       #OUT + "enter lexer " + rname + "; c==" + LA(1) + 'n';
  194.    end;
  195.    trace_out ( rname : STR ) is 
  196.       #OUT + "exit lexer " + rname + "; c==" + LA(1) + 'n';
  197.    end;
  198.    
  199.    line : INT is
  200.       return input_state.line;
  201.    end;
  202.    column : INT is
  203.       return input_state.column;
  204.    end;
  205.    
  206.    file_name : STR is
  207.       return input_state.file_name;
  208.    end;
  209.    
  210.    file_name( name : STR ) is
  211.       input_state.file_name := name;
  212.    end;
  213.    token : TOKEN is
  214.       return sa_return_token;
  215.    end;
  216.    -- This method is called by YourLexer.nextToken() when the lexer has
  217.    -- hit EOF condition.  EOF is NOT a character.
  218.    -- This method is not called if EOF is reached during
  219.    -- syntactic predicate evaluation or during evaluation
  220.    -- of normal lexical rules, which presumably would be
  221.    -- an IOException.  This traps the "normal" EOF condition.
  222.    --
  223.    -- upon_eof is called after the complete evaluation of
  224.    -- the previous token and only if your parser asks
  225.    -- for another token beyond that last non-EOF token.
  226.    --
  227.    -- You might want to throw token or char stream exceptions
  228.    -- like: "Heh, premature eof" or a retry stream exception
  229.    -- ("I found the end of this file, go back to referencing file").
  230.    --
  231.  
  232.    upon_eof is
  233.    end;
  234.    
  235. end;