58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
# pragma once
|
|
#include "stdc++.h"
|
|
#include "Token.h"
|
|
#include "Tbs.h"
|
|
#include <cstdlib>
|
|
#include <vector>
|
|
#include <iostream>
|
|
|
|
class Scanner {
|
|
public:
|
|
Scanner(std::string source_code, Tbs tables)
|
|
: m_source_code(source_code), m_tables(tables) {}
|
|
|
|
|
|
void scan() {
|
|
int len = 0;
|
|
for (int i = 0; i < m_source_code.size(); i++) {
|
|
if (len = process_const_table(i)) {
|
|
i += len - 1;
|
|
len = 0;
|
|
} else if (len = process_identifier_table(i)) {
|
|
i += len - 1;
|
|
len = 0;
|
|
} else if (len = process_key_table(i)) {
|
|
i += len - 1;
|
|
len = 0;
|
|
} else if (len = process_punct_table(i)) {
|
|
i += len - 1;
|
|
len = 0;
|
|
} else if (m_source_code[i] == ' ' || m_source_code[i] == '\t' || m_source_code[i] == '\n') {
|
|
continue;
|
|
} else {
|
|
std::cerr << "Error: Tokenize" << std::endl;
|
|
exit(0);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
inline std::vector<Token> get_token_list() {
|
|
return m_token_list;
|
|
}
|
|
|
|
int process_const_table(int i);
|
|
int process_identifier_table(int i);
|
|
int process_key_table(int i);
|
|
int process_punct_table(int i);
|
|
|
|
|
|
private:
|
|
std::string m_source_code;
|
|
std::vector<Token> m_token_list;
|
|
Tbs m_tables;
|
|
int index;
|
|
|
|
// 记录标识符表的索引
|
|
int identifier_index = 0;
|
|
}; |