You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BasicTokenSource.java 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.patterns;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import org.aspectj.weaver.BCException;
  16. import org.aspectj.weaver.ISourceContext;
  17. public class BasicTokenSource implements ITokenSource {
  18. private int index = 0;
  19. private IToken[] tokens;
  20. private ISourceContext sourceContext;
  21. public BasicTokenSource(IToken[] tokens, ISourceContext sourceContext) {
  22. this.tokens = tokens;
  23. this.sourceContext = sourceContext;
  24. }
  25. public int getIndex() {
  26. return index;
  27. }
  28. public void setIndex(int newIndex) {
  29. this.index = newIndex;
  30. }
  31. public IToken next() {
  32. try {
  33. return tokens[index++];
  34. } catch (ArrayIndexOutOfBoundsException e) {
  35. return IToken.EOF;
  36. }
  37. }
  38. public IToken peek() {
  39. try {
  40. return tokens[index];
  41. } catch (ArrayIndexOutOfBoundsException e) {
  42. return IToken.EOF;
  43. }
  44. }
  45. public IToken peek(int offset) {
  46. try {
  47. return tokens[index+offset];
  48. } catch (ArrayIndexOutOfBoundsException e) {
  49. return IToken.EOF;
  50. }
  51. }
  52. public String toString() {
  53. StringBuffer buf = new StringBuffer();
  54. buf.append("[");
  55. for (int i = 0; i < tokens.length; i++) {
  56. IToken t = tokens[i];
  57. if (t == null)
  58. break;
  59. if (i > 0)
  60. buf.append(", ");
  61. buf.append(t.toString());
  62. }
  63. buf.append("]");
  64. return buf.toString();
  65. }
  66. //////////////////////////////////////////////////////
  67. // Convenience, maybe just for testing
  68. public static ITokenSource makeTokenSource(String input, ISourceContext context) {
  69. char[] chars = input.toCharArray();
  70. int i = 0;
  71. List<BasicToken> tokens = new ArrayList<BasicToken>();
  72. while (i < chars.length) {
  73. char ch = chars[i++];
  74. switch(ch) {
  75. case ' ':
  76. case '\t':
  77. case '\n':
  78. case '\r':
  79. continue;
  80. case '*':
  81. case '(':
  82. case ')':
  83. case '+':
  84. case '[':
  85. case ']':
  86. case ',':
  87. case '!':
  88. case ':':
  89. case '@':
  90. case '<':
  91. case '>':
  92. case '=':
  93. case '?':
  94. tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1));
  95. continue;
  96. case '.':
  97. if ((i+2)<=chars.length) {
  98. // could be '...'
  99. char nextChar1 = chars[i];
  100. char nextChar2 = chars[i+1];
  101. if (ch==nextChar1 && ch==nextChar2) {
  102. // '...'
  103. tokens.add(BasicToken.makeIdentifier("...",i-1,i+1));
  104. i=i+2;
  105. } else {
  106. tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1));
  107. }
  108. } else {
  109. tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1));
  110. }
  111. continue;
  112. case '&':
  113. if ((i+1) <= chars.length && chars[i] != '&') {
  114. tokens.add(BasicToken.makeOperator(makeString(ch),i-1,i-1));
  115. continue;
  116. }
  117. // fall-through
  118. case '|':
  119. if (i == chars.length) {
  120. throw new BCException("bad " + ch);
  121. }
  122. char nextChar = chars[i++];
  123. if (nextChar == ch) {
  124. tokens.add(BasicToken.makeOperator(makeString(ch, 2), i-2, i-1));
  125. } else {
  126. throw new RuntimeException("bad " + ch);
  127. }
  128. continue;
  129. case '\"':
  130. int start0 = i-1;
  131. while (i < chars.length && !(chars[i]=='\"')) i++;
  132. i += 1;
  133. tokens.add(BasicToken.makeLiteral(new String(chars, start0+1, i-start0-2), "string", start0, i-1));
  134. continue;
  135. default:
  136. int start = i-1;
  137. while (i < chars.length && Character.isJavaIdentifierPart(chars[i])) { i++; }
  138. tokens.add(BasicToken.makeIdentifier(new String(chars, start, i-start), start, i-1));
  139. }
  140. }
  141. //System.out.println(tokens);
  142. return new BasicTokenSource((IToken[])tokens.toArray(new IToken[tokens.size()]), context);
  143. }
  144. private static String makeString(char ch) {
  145. return Character.toString(ch);
  146. }
  147. private static String makeString(char ch, int count) {
  148. // slightly inefficient ;-)
  149. char[] chars = new char[count];
  150. for (int i=0; i<count; i++) { chars[i] = ch; }
  151. return new String(chars);
  152. }
  153. public ISourceContext getSourceContext() {
  154. return sourceContext;
  155. }
  156. public void setSourceContext(ISourceContext context) {
  157. this.sourceContext = context;
  158. }
  159. }