121 lines
2.5 KiB
C
121 lines
2.5 KiB
C
#ifndef LEX_H
|
|
#define LEX_H
|
|
|
|
#include "error_buffer.h"
|
|
|
|
#define LEX_DEBUG
|
|
|
|
/**
|
|
* @brief Typ tokenu
|
|
*/
|
|
enum token_type {
|
|
TOK_EOF,
|
|
TOK_ERROR,
|
|
|
|
TOK_NUMBER,
|
|
TOK_PLUS,
|
|
TOK_MINUS,
|
|
TOK_MULTIPLY,
|
|
TOK_DIVIDE,
|
|
TOK_POWER,
|
|
|
|
TOK_VARIABLE,
|
|
TOK_FUNCTION,
|
|
|
|
TOK_LEFT_PAREN,
|
|
TOK_RIGHT_PAREN,
|
|
TOK_COMMA
|
|
};
|
|
|
|
/**
|
|
* @brief Token
|
|
*
|
|
* Struktura popisující konkrétní token, který se vyskytnul při lexikální analýze funkce.
|
|
*/
|
|
struct token {
|
|
enum token_type type;
|
|
union token_val {
|
|
double num;
|
|
size_t fn_idx;
|
|
} val;
|
|
};
|
|
|
|
/**
|
|
* @brief Lexikální analyzátor (lexer)
|
|
*
|
|
* Struktura uchovávající stav lexikálního analyzátoru.
|
|
*/
|
|
struct lexer {
|
|
const char *start;
|
|
const char *prev_p;
|
|
const char *p;
|
|
struct token tok;
|
|
struct error_buffer eb;
|
|
const char *variable_name;
|
|
};
|
|
|
|
/**
|
|
* @brief Inicializuje lexikální analyzátor
|
|
*
|
|
* @param lex Lexer
|
|
* @param str Řetězec pro analýzu
|
|
* @param variable_name Název proměnné
|
|
*/
|
|
void lex_init(struct lexer *lex, const char *str, const char *variable_name);
|
|
|
|
/**
|
|
* @brief Načte další token
|
|
*
|
|
* @param lex Lexer
|
|
*/
|
|
void lex_next(struct lexer *lex);
|
|
|
|
/**
|
|
* @brief Vrátí adresu na aktuální token
|
|
*
|
|
* @param lex Lexer
|
|
* @return Adresa na token
|
|
*/
|
|
struct token *lex_token(struct lexer *lex);
|
|
|
|
/**
|
|
* @brief Vypíše informaci o aktuální pozici ve vstupním řetězci
|
|
*
|
|
* Tato funkce je volána, když při zpracování vstupní funkce nastane chyba.
|
|
*
|
|
* @param lex Lexer
|
|
* @param eb Zásobník, do kterého bude informace vypsána
|
|
*/
|
|
void lex_print_position(const struct lexer *lex, struct error_buffer *eb);
|
|
|
|
/**
|
|
* @brief Vrátí kód chyby, která nastala při lexikální analýze
|
|
*
|
|
* @param lex Lexer
|
|
* @return Chybový kód
|
|
*/
|
|
enum error_code lex_get_error(const struct lexer *lex);
|
|
|
|
/**
|
|
* @brief Vrátí textovou reprezentaci chyby, která nastala při lexikální analýze
|
|
*
|
|
* @param lex Lexer
|
|
* @return Řetězec s chybou
|
|
*/
|
|
const char *lex_get_error_text(const struct lexer *lex);
|
|
|
|
/**
|
|
* @brief Vrátí textovou reprezentaci tokenu
|
|
*
|
|
* Tato funkce zohledńuje pouze typ tokenu, hodnota (např. číselná u konstanty) nebude v řetězci obsažena.
|
|
*
|
|
* @param token Token
|
|
* @return Textová reprezentace
|
|
*/
|
|
const char *lex_token_str(enum token_type token);
|
|
|
|
#ifdef LEX_DEBUG
|
|
void lex_debug_print_token(const struct token *tok);
|
|
#endif /* LEX_DEBUG */
|
|
|
|
#endif /* LEX_H */ |