PageRenderTime 52ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/src/lexer.d

https://bitbucket.org/stqn/rwkc
D | 189 lines | 132 code | 40 blank | 17 comment | 14 complexity | 93dc3a522553822edffeabfa840be317 MD5 | raw file
Possible License(s): MIT
  1. module lexer;
  2. import std.stdio;
  3. import std.string;
  4. import std.conv;
  5. enum TOK { UNKNOWN, EOF, BLANK, KEYWORD, STRING, NUMBER, ASSIGN, OPENBRACE, CLOSEDBRACE, SEMICOLON, COMMENT };
  6. struct token {
  7. TOK type;
  8. char[] string;
  9. int line;
  10. }
  11. class Lexer {
  12. char[] block;
  13. int i;
  14. uint line=1;
  15. this( char[] aBlock ) {
  16. block = aBlock;
  17. }
  18. bool keyword(inout token t) {
  19. while(true) {
  20. if( inPattern(block[i], "0-9a-zA-Z_") ) {
  21. t.string ~= block[i];
  22. }
  23. else return(true);
  24. i++;
  25. if(i>block.length) return(false);
  26. }
  27. }
  28. bool string(inout token t) {
  29. while(true) {
  30. if( block[i] != '\"' ) {
  31. t.string ~= block[i];
  32. }
  33. else { i++; return(true); }
  34. i++;
  35. if(i>block.length) return(false);
  36. }
  37. }
  38. bool integer(inout token t) {
  39. while(true) {
  40. if( inPattern(block[i], "0-9--") ) {
  41. t.string ~= block[i];
  42. }
  43. else { i++; return(true); }
  44. i++;
  45. if(i>block.length) return(false);
  46. }
  47. }
  48. bool comment( inout token t ) {
  49. while(true) {
  50. if( block[i] != '\n' ) {
  51. t.string ~= block[i];
  52. }
  53. else { i++; return(true); }
  54. i++;
  55. if(i>block.length) return(false);
  56. }
  57. }
  58. /*
  59. bool block( inout tokern t ) {
  60. int level=0;
  61. while(true) {
  62. if( block[i] == '{' ) level++;
  63. if( block[i] == '}' ) level--;
  64. if( block[i] != '}' && level >= 0 ) {
  65. t.string ~= block[i];
  66. }
  67. else { i++; return(true); }
  68. i++;
  69. if( i>block.length ) return(false);
  70. }
  71. }
  72. */
  73. void nextToken(inout token t) {
  74. t.string="";
  75. while(true) {
  76. switch(block[i]) {
  77. case 0:
  78. case 0x1A:
  79. t.type=TOK.EOF;
  80. return;
  81. case 'a' : case 'b' : case 'c' : case 'd' :
  82. case 'e' : case 'f' : case 'g' : case 'h' :
  83. case 'i' : case 'j' : case 'k' : case 'l' :
  84. case 'm' : case 'n' : case 'o' : case 'p' :
  85. case 'q' : case 'r' : case 's' : case 't' :
  86. case 'u' : case 'v' : case 'w' : case 'x' :
  87. case 'y' : case 'z' :
  88. case 'A' : case 'B' : case 'C' : case 'D' :
  89. case 'E' : case 'F' : case 'G' : case 'H' :
  90. case 'I' : case 'J' : case 'K' : case 'L' :
  91. case 'M' : case 'N' : case 'O' : case 'P' :
  92. case 'Q' : case 'R' : case 'S' : case 'T' :
  93. case 'U' : case 'V' : case 'W' : case 'X' :
  94. case 'Y' : case 'Z' : case '_' :
  95. t.type=TOK.KEYWORD;
  96. keyword(t);
  97. return;
  98. case '\r' :
  99. i++;
  100. continue;
  101. case '\n' :
  102. line++;
  103. t.line=line;
  104. i++;
  105. continue;
  106. case ' ' :
  107. case '\t' :
  108. case '\v' :
  109. t.type=TOK.BLANK;
  110. i++;
  111. continue;
  112. case '{' :
  113. t.type=TOK.OPENBRACE;
  114. i++;
  115. return;
  116. case '}' :
  117. t.type=TOK.CLOSEDBRACE;
  118. i++;
  119. return;
  120. case '"' :
  121. t.type=TOK.STRING;
  122. i++;
  123. string(t);
  124. return;
  125. case '=' :
  126. i++;
  127. t.type=TOK.ASSIGN;
  128. return;
  129. case ';' :
  130. i++;
  131. t.type=TOK.COMMENT;
  132. comment(t);
  133. return;
  134. case '0' : case '1' : case '2' : case '3' :
  135. case '4' : case '5' : case '6' : case '7' :
  136. case '8' : case '9' : case '-' :
  137. t.type=TOK.NUMBER;
  138. integer(t);
  139. return;
  140. default :
  141. t.type = TOK.UNKNOWN;
  142. i++;
  143. return;
  144. }
  145. }
  146. }
  147. }