ANTLRHashString.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/ANTLRHashString.java#1 $
  7.  */
  8. // class implements a String-like object whose sole purpose is to be
  9. // entered into a lexer HashTable.  It uses a lexer object to get
  10. // information about case sensitivity.
  11. public class ANTLRHashString {
  12. // only one of s or buf is non-null
  13. private String s;
  14. private char[] buf;
  15. private int len;
  16. private CharScanner lexer;
  17. private static final int prime = 151;
  18. public ANTLRHashString(char[] buf, int length, CharScanner lexer) {
  19. this.lexer = lexer;
  20. setBuffer(buf, length);
  21. }
  22. // Hash strings constructed this way are unusable until setBuffer or setString are called.
  23. public ANTLRHashString(CharScanner lexer) {
  24. this.lexer = lexer;
  25. }
  26. public ANTLRHashString(String s, CharScanner lexer) {
  27. this.lexer = lexer;
  28. setString(s);
  29. }
  30. private final char charAt(int index) {
  31. return (s!=null) ? s.charAt(index) : buf[index];
  32. }
  33. // Return true if o is an ANTLRHashString equal to this.
  34. public boolean equals(Object o) {
  35. if (!(o instanceof ANTLRHashString) && !(o instanceof String)) {
  36. return false;
  37. }
  38. ANTLRHashString s;
  39. if ( o instanceof String ) {
  40. s = new ANTLRHashString((String)o,lexer);
  41. }
  42. else {
  43. s = (ANTLRHashString)o;
  44. }
  45. int l = length();
  46. if (s.length() != l) {
  47. return false;
  48. }
  49. if (lexer.getCaseSensitiveLiterals()) {
  50. for (int i = 0; i < l; i++) {
  51. if (charAt(i) != s.charAt(i)) {
  52. return false;
  53. }
  54. }
  55. } else {
  56. for (int i = 0; i < l; i++) {
  57. if (lexer.toLower(charAt(i)) != lexer.toLower(s.charAt(i))) {
  58. return false;
  59. }
  60. }
  61. }
  62. return true;
  63. }
  64. public int hashCode() {
  65. int hashval = 0;
  66. int l = length();
  67. if (lexer.getCaseSensitiveLiterals()) {
  68. for (int i = 0; i < l; i++) {
  69. hashval = hashval * prime + charAt(i);
  70. }
  71. } else {
  72. for (int i = 0; i < l; i++) {
  73. hashval = hashval * prime + lexer.toLower(charAt(i));
  74. }
  75. }
  76. return hashval;
  77. }
  78. private final int length() {
  79. return (s!=null) ? s.length() : len;
  80. }
  81. public void setBuffer(char[] buf, int length) {
  82. this.buf = buf;
  83. this.len = length;
  84. s = null;
  85. }
  86. public void setString(String s) {
  87. this.s = s;
  88. buf = null;
  89. }
  90. }