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

编译器/解释器

开发平台:

Others

  1. package antlr;
  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/antlr/TokenStreamSelector.java#1 $
  7.  */
  8. import java.util.Hashtable;
  9. import antlr.collections.impl.LList;
  10. import antlr.collections.Stack;
  11. import java.io.IOException;
  12. /** A token stream MUX (multiplexor) knows about n token streams
  13.  *  and can multiplex them onto the same channel for use by token
  14.  *  stream consumer like a parser.  This is a way to have multiple
  15.  *  lexers break up the same input stream for a single parser.
  16.  * Or, you can have multiple instances of the same lexer handle
  17.  *  multiple input streams; this works great for includes.
  18.  */
  19. public class TokenStreamSelector implements TokenStream {
  20. /** The set of inputs to the MUX */
  21. protected Hashtable inputStreamNames;
  22. /** The currently-selected token stream input */
  23. protected TokenStream input;
  24. /** Used to track stack of input streams */
  25. protected Stack streamStack = new LList();
  26. public TokenStreamSelector() {
  27. super();
  28. inputStreamNames = new Hashtable();
  29. }
  30. public void addInputStream(TokenStream stream, String key) {
  31. inputStreamNames.put(key, stream);
  32. }
  33. /** Return the stream from tokens are being pulled at
  34.  *  the moment.
  35.  */
  36. public TokenStream getCurrentStream() {
  37. return input;
  38. }
  39. public TokenStream getStream(String sname) {
  40. TokenStream stream = (TokenStream)inputStreamNames.get(sname);
  41. if ( stream==null ) {
  42. throw new IllegalArgumentException("TokenStream "+sname+" not found");
  43. }
  44. return stream;
  45. }
  46. public Token nextToken() throws TokenStreamException {
  47. // return input.nextToken();
  48. // keep looking for a token until you don't
  49. // get a retry exception.
  50. for (;;) {
  51. try {
  52. return input.nextToken();
  53. }
  54. catch (TokenStreamRetryException r) {
  55. // just retry "forever"
  56. }
  57. }
  58. }
  59. public TokenStream pop() {
  60. TokenStream stream = (TokenStream) streamStack.pop();
  61. select(stream);
  62. return stream;
  63. }
  64. public void push(TokenStream stream) {
  65. streamStack.push(input); // save current stream
  66. select(stream);
  67. }
  68. public void push(String sname) {
  69. streamStack.push(input);
  70. select(sname);
  71. }
  72. /** Abort recognition of current Token and try again.
  73.  *  A stream can push a new stream (for include files
  74.  *  for example, and then retry(), which will cause
  75.  *  the current stream to abort back to this.nextToken().
  76.  *  this.nextToken() then asks for a token from the
  77.  *  current stream, which is the new "substream."
  78.  */
  79. public void retry() throws TokenStreamRetryException {
  80. throw new TokenStreamRetryException();
  81. }
  82. /** Set the stream without pushing old stream */
  83. public void select(TokenStream stream) {
  84. input = stream;
  85. }
  86. public void select(String sname) throws IllegalArgumentException {
  87. input = getStream(sname);
  88. }
  89. }