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

编译器/解释器

开发平台:

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/token_buffer.sa#1 $
  7. *)
  8. class ANTLR_TOKEN_BUFFER{ TOKEN < $ANTLR_TOKEN } is
  9.    -- MI: this has a lot in common with input_buffer/byte_buffer.
  10.    -- could possibly factor out common code using Sather's spiffy
  11.    -- parametrized class feature
  12.    -- Token source
  13.    private attr input : $ANTLR_TOKEN_STREAM{TOKEN};
  14.    -- Number of active markers
  15.    private attr n_markers : INT;
  16.    
  17.    -- Additional offset used when markers are active
  18.    private attr marker_offset : INT;
  19.    -- Number of calls to consume() since last LA() or LT() call
  20.    private attr num_to_consume : INT;
  21.    -- Circular queue
  22.    private attr queue : CIRCULAR_QUEUE{TOKEN};
  23.    init is 
  24.       num_to_consume := 0;
  25.       n_markers := 0;
  26.       marker_offset := 0;
  27.       queue := #CIRCULAR_QUEUE{TOKEN}(1);
  28.    end;
  29.    
  30.    -- Mark another token for deferred consumption 
  31.    consume is 
  32.       num_to_consume := num_to_consume + 1;
  33.    end;
  34.    -- Get a lookahead token value 
  35.    LA( i : INT ) : INT is
  36.       fill(i);
  37.       return queue[ marker_offset + i - 1].ttype;
  38.    end;
  39.    LT( i : INT ) : TOKEN is
  40.       fill(i);
  41.       return queue[ marker_offset + i - 1 ];
  42.    end;
  43.    -- Return an integer marker that can be used to rewind the buffer to
  44.    -- its current state.
  45.    mark : INT is 
  46.       sync_consume;
  47.       n_markers := n_markers + 1;
  48.       return marker_offset;
  49.    end;
  50.    -- Rewind the token buffer to a marker.
  51.    -- mark is the marker returned previously from mark()
  52.    rewind( mark : INT ) is
  53.       sync_consume;
  54.       marker_offset := mark;
  55.       n_markers := n_markers - 1;
  56.    end;
  57.    
  58.    -- Sync up deferred consumption 
  59.    private sync_consume is
  60.       loop while!( num_to_consume > 0 ); 
  61.  if n_markers > 0 then
  62.     -- guess mode -- leave leading tokens and bump offset.
  63.     marker_offset := marker_offset + 1;
  64.  else 
  65.     -- normal mode; remove first token
  66.     queue.remove_first;
  67.  end;
  68.  num_to_consume := num_to_consume - 1;
  69.       end;
  70.    end;
  71.    
  72.    -- Create a token buffer 
  73.    create ( in : $ANTLR_TOKEN_STREAM{TOKEN} ) : SAME pre ~void(in) is 
  74.       res : SAME := new;
  75.       res.input := in;
  76.       res.init;
  77.       return res;
  78.    end;
  79.    -- Ensure that the token buffer is sufficiently full 
  80.    fill( amount : INT ) is
  81.       sync_consume;
  82.       -- Fill the buffer sufficiently to hold needed tokens
  83.       loop while! ( queue.num_entries < amount + marker_offset );
  84.  -- Append the next token
  85.  queue.append( input.next_token );
  86.       end;
  87.    end;
  88. end;