token_stream_selector.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_stream_selector.sa#1 $
  7. *)
  8. -- A token stream MUX (multiplexor) knows about n token streams
  9. -- and can multiplex them onto the same channel for use by token
  10. -- stream consumer like a parser.  This is a way to have multiple
  11. -- lexers break up the same input stream for a single parser.
  12. -- Or, you can have multiple instances of the same lexer handle
  13. -- multiple input streams; this works great for includes.
  14. class ANTLR_TOKEN_STREAM_SELECTOR{TOKEN < $ANTLR_TOKEN} < $ANTLR_TOKEN_STREAM{TOKEN} is
  15.    -- The set of inputs to the MUX 
  16.    private attr name_to_stream : MAP{STR,$ANTLR_TOKEN_STREAM{TOKEN}};
  17.    -- The currently-selected token stream input 
  18.    attr current_stream : $ANTLR_TOKEN_STREAM{TOKEN};
  19.    -- Used to track stack of input streams 
  20.    private attr stream_stack : NR_A_STACK{$ANTLR_TOKEN_STREAM{TOKEN}};
  21.    create : SAME is
  22.       res ::= new;
  23.       res.name_to_stream := #MAP{STR,$ANTLR_TOKEN_STREAM{TOKEN}};
  24.       res.stream_stack := #NR_A_STACK{$ANTLR_TOKEN_STREAM{TOKEN}};
  25.       return res;
  26.    end;
  27.    add_input_stream( stream : $ANTLR_TOKEN_STREAM{TOKEN}, key : STR ) is
  28.       name_to_stream[key] := stream;
  29.    end;
  30.    stream( sname : STR ) : $ANTLR_TOKEN_STREAM{TOKEN} is
  31.       stream_ ::= name_to_stream[sname];
  32.       if ( void(stream_) ) then
  33.  raise "$ANTLR_TOKEN_STREAM " + sname + " not found";
  34.       end;
  35.       return stream_;
  36.    end;
  37.    -- keep looking for a token until you don't
  38.    -- get a retry exception.
  39.    next_token : TOKEN is
  40.       loop 
  41.  protect
  42.     return current_stream.next_token;
  43.  when ANTLR_TOKEN_STREAM_RETRY_EXCEPTION then
  44.     -- just retry forever
  45.  end;
  46.       end;
  47.    end;
  48.    pop : $ANTLR_TOKEN_STREAM{TOKEN} is
  49.       stream_ ::= stream_stack.pop;
  50.       select(stream_);
  51.       return stream_;
  52.    end;
  53.    
  54.    pop is
  55.       stream_ ::= stream_stack.pop;
  56.       select(stream_);
  57.    end;
  58.    push( stream_ : $ANTLR_TOKEN_STREAM{TOKEN} ) is
  59.       stream_stack.push(current_stream); -- save current stream
  60.       select(stream_);
  61.    end;
  62.    push( name : STR ) is
  63.       stream_stack.push(current_stream);
  64.       select(name);
  65.    end;
  66.    -- Abort recognition of current Token and try again.
  67.    -- A stream can push a new stream (for include files
  68.    -- for example, and then retry, which will cause
  69.    -- the current stream to abort back to self.next_token.
  70.    -- self.next_token then asks for a token from the
  71.    -- current stream, which is the new "substream."
  72.    retry is
  73.       raise #ANTLR_TOKEN_STREAM_RETRY_EXCEPTION;
  74.    end;
  75.    
  76.    -- Set the stream without pushing old stream 
  77.    select( stream_ : $ANTLR_TOKEN_STREAM{TOKEN} ) is
  78.       current_stream := stream_;
  79.    end;
  80.    select( name : STR ) is
  81.       current_stream := stream( name );
  82.    end;
  83. end;