TokenStream.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <cstring>
  2. #include "tokenizer/TokenStream.h"
  3. TokenStream::TokenStream() : readIndex(0) {
  4. }
  5. bool TokenStream::hasToken() const {
  6. return readIndex < buffer.size();
  7. }
  8. String TokenStream::nextTokenString() {
  9. String s;
  10. s += '(';
  11. s += nextLine();
  12. s += ", ";
  13. Token token = nextToken();
  14. s += getTokenEnumName(token);
  15. if(token == STRING || token == LITERAL || token == LABEL) {
  16. s += ", \"";
  17. s += nextString();
  18. s += '"';
  19. }
  20. if(token == NUMBER) {
  21. s += ", ";
  22. s += nextDouble();
  23. }
  24. s += ')';
  25. return s;
  26. }
  27. void TokenStream::read(void* data, size_t length) {
  28. memcpy(data, buffer.data() + readIndex, length);
  29. readIndex += length;
  30. }
  31. Token TokenStream::nextToken() {
  32. Token token = EOF_TOKEN;
  33. read(&token, sizeof (unsigned int));
  34. return token;
  35. }
  36. unsigned int TokenStream::nextLine() {
  37. unsigned int line = 0;
  38. read(&line, sizeof (unsigned int));
  39. return line;
  40. }
  41. const char* TokenStream::nextString() {
  42. size_t offset = readIndex;
  43. readIndex += strlen(buffer.data() + readIndex) + 1;
  44. return buffer.data() + offset;
  45. }
  46. double TokenStream::nextDouble() {
  47. double d;
  48. read(&d, sizeof (double));
  49. return d;
  50. }
  51. void TokenStream::write(const void* data, size_t length) {
  52. const char* chars = static_cast<const char*> (data);
  53. for(size_t i = 0; i < length; i++) {
  54. buffer.push_back(chars[i]);
  55. }
  56. }
  57. void TokenStream::add(Token token, unsigned int line) {
  58. write(&line, sizeof (unsigned int));
  59. write(&token, sizeof (Token));
  60. }
  61. void TokenStream::add(Token token, unsigned int line, double d) {
  62. add(token, line);
  63. write(&d, sizeof (double));
  64. }
  65. void TokenStream::add(Token token, unsigned int line, const char* text) {
  66. add(token, line);
  67. write(text, strlen(text) + 1);
  68. }