Код: Выделить всё
#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]