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

编译器/解释器

开发平台:

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/TokenQueue.java#1 $
  7.  */
  8. /** A private circular buffer object used by the token buffer */
  9. class TokenQueue {
  10. // Physical circular buffer of tokens
  11. private Token[] buffer;
  12. // buffer.length-1 for quick modulous
  13. private int sizeLessOne;
  14. // physical index of front token
  15. private int offset;
  16. // number of tokens in the queue
  17. protected int nbrEntries;
  18. public TokenQueue(int minSize) {
  19. // Find first power of 2 >= to requested size
  20. int size;
  21. for (size = 2; size < minSize; size *= 2) {;}
  22. init(size);
  23. }
  24. /** Add token to end of the queue
  25.  * @param tok The token to add
  26.  */
  27. public final void append(Token tok)
  28. {
  29. if (nbrEntries == buffer.length)
  30. {
  31. expand();
  32. }
  33. buffer[(offset + nbrEntries) & sizeLessOne] = tok;
  34. nbrEntries++;
  35. }
  36. /** Fetch a token from the queue by index
  37.  * @param idx The index of the token to fetch, where zero is the token at the front of the queue
  38.  */
  39. public final Token elementAt(int idx) { 
  40. return buffer[(offset + idx) & sizeLessOne];
  41. }
  42. /** Expand the token buffer by doubling its capacity */
  43. private final void expand()
  44. {
  45. Token[] newBuffer = new Token[buffer.length * 2];
  46. // Copy the contents to the new buffer
  47. // Note that this will store the first logical item in the 
  48. // first physical array element.
  49. for (int i = 0; i < buffer.length; i++)
  50. {
  51. newBuffer[i] = elementAt(i);
  52. }
  53. // Re-initialize with new contents, keep old nbrEntries
  54. buffer = newBuffer;
  55. sizeLessOne = buffer.length - 1;
  56. offset = 0;
  57. }
  58. /** Initialize the queue.
  59.  * @param size The initial size of the queue
  60.  */
  61. private final void init(int size) {
  62. // Allocate buffer
  63. buffer = new Token[size];
  64. // Other initialization
  65. sizeLessOne = size - 1;
  66. offset = 0;
  67. nbrEntries = 0;
  68. }
  69. /** Remove token from front of queue */
  70. public final void removeFirst() { 
  71. offset = (offset+1) & sizeLessOne;
  72. nbrEntries--;
  73. }
  74. }