Lex S-выражения C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Lex S-выражения C++

Сообщение Anonymous »

Я пытаюсь создать высокопроизводительный DSL на основе S-Expression, скомпилированный C++/LLVM. Я написал для него небольшой лексер, но получаю бесконечный цикл для всех тестовых случаев, которые я проверяю, без ошибок (которые прекрасно улавливаются и обрабатываются). В чем может быть причина?

Код: Выделить всё

#include 
#include 
#include 
#include 

enum class TokenType {
BLOCK,
IF,
LET,
VAR,
QUOTE,
SET,
LAMBDA,
MACRO,
INTEGER,
FLOAT,
STRING,
BEGIN,
END,
SYMBOL,
BUILTIN,
TERMINATE
};

struct Token {
TokenType type;
std::string value;
};

class Lexer {
std::string code;
unsigned index = 0;

Token gettok(void) {
std::string data;

while (index < code.length() && code[index] != '(' && code[index] != ')' && code[index] != '"' && !std::isspace(code[index]))
data += code[index++];

// Handle (...)
if (data == "(") return { TokenType::BEGIN, data };
if (data == ")") return { TokenType::END, data };

// Handle $ID
if (data[0] == '$') return { TokenType::SYMBOL, data };

// String/Number/Comment handling are not relevant

// Handle special operators
if (data == "block") return { TokenType::BLOCK, data };
if (data == "if") return { TokenType::IF, data };
if (data == "let") return { TokenType::LET, data };
if (data == "var") return { TokenType::VAR, data };
if (data == "quote") return { TokenType::QUOTE, data };
if (data == "set") return { TokenType::SET, data };
if (data == "lambda") return { TokenType::LAMBDA, data };
if (data == "macro") return { TokenType::MACRO, data };

// Handle builtins
return { TokenType::BUILTIN, data };
}
public:
Lexer(std::string const& arg) : code(arg + "  ") {}

std::vector lex(void) {
std::vector out;
Token next = gettok();

while (next.type != TokenType::TERMINATE) {
out.push_back(next);
next = gettok();
}

return out;
}
};

auto test= R"(
(function main (x) (block
(let $out zero)
$out)))";

int main(void) {
Lexer lexer(example);
auto foo = lexer.lex();
for (auto& bar : foo) std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78540902/lex-s-expressions-c[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»