实现int Scanner::process_key_table(int index)
This commit is contained in:
parent
7eb6630248
commit
0583348986
@ -1,5 +1,6 @@
|
|||||||
#include "Scanner.h"
|
#include "Scanner.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
int Scanner::process_const_table(int index) {
|
int Scanner::process_const_table(int index) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -34,7 +35,45 @@ int Scanner::process_identifier_table(int index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Scanner::process_key_table(int index) {
|
int Scanner::process_key_table(int index) {
|
||||||
return 0;
|
int max_len = 0;
|
||||||
|
int found_key = -1; // 存储找到的关键字编号
|
||||||
|
|
||||||
|
// 遍历关键字表
|
||||||
|
for (const auto& pair : m_tables.KeyTable) {
|
||||||
|
const std::string& keyword = pair.second;
|
||||||
|
int len = keyword.length();
|
||||||
|
|
||||||
|
// 检查剩余长度是否足够
|
||||||
|
if (index + len > m_source_code.length()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较子串是否匹配关键字
|
||||||
|
if (m_source_code.substr(index, len) == keyword) {
|
||||||
|
// 检查关键字后是否紧跟字母/数字/下划线
|
||||||
|
if (index + len < m_source_code.length()) {
|
||||||
|
char next_char = m_source_code[index + len];
|
||||||
|
if (isalnum(next_char) || next_char == '_') {
|
||||||
|
continue; // 是标识符的一部分,跳过
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新最长匹配(解决"float32"和"float64"的冲突)
|
||||||
|
if (len > max_len) {
|
||||||
|
max_len = len;
|
||||||
|
found_key = pair.first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 找到有效关键字
|
||||||
|
if (max_len > 0) {
|
||||||
|
Token token({ found_key, KEY_TABLE });
|
||||||
|
m_token_list.push_back(token);
|
||||||
|
return max_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; // 未识别到关键字
|
||||||
}
|
}
|
||||||
|
|
||||||
int Scanner::process_punct_table(int index) {
|
int Scanner::process_punct_table(int index) {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "Tbs.h"
|
#include "Tbs.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
using std::string,std::vector;
|
using std::string,std::vector;
|
||||||
|
//
|
||||||
TEST_CASE("Scanner test identifier table") {
|
TEST_CASE("Scanner test identifier table") {
|
||||||
Tbs tables;
|
Tbs tables;
|
||||||
std::string src = "abcvljl laadfs fafarwrw";
|
std::string src = "abcvljl laadfs fafarwrw";
|
||||||
@ -27,4 +27,15 @@ TEST_CASE("Scanner test Punct table") {
|
|||||||
for (auto e : scan.get_token_list()) {
|
for (auto e : scan.get_token_list()) {
|
||||||
std::cout<<e.id<<" "<<e.type<<" "<<tables.PunctTable[e.id]<<"\n";
|
std::cout<<e.id<<" "<<e.type<<" "<<tables.PunctTable[e.id]<<"\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Scanner test key table") {
|
||||||
|
Tbs tables = {};
|
||||||
|
std::string src = "i32";
|
||||||
|
Scanner scan(src, tables);
|
||||||
|
scan.scan();
|
||||||
|
std::cout<<"test\n";
|
||||||
|
for (auto e : scan.get_token_list()) {
|
||||||
|
std::cout<<e.id<<" "<<e.type <<"\n";
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user