Rename lexer_states to lexer
This commit is contained in:
parent
909bcf3056
commit
0095d8fe61
40
include/lexer/lexer.h
Normal file
40
include/lexer/lexer.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#ifndef LEXER_STATES_H
|
||||||
|
#define LEXER_STATES_H
|
||||||
|
|
||||||
|
#include "aliases.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define VALID_JSON true
|
||||||
|
#define INVALID_JSON false
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TK_L_BRACE,
|
||||||
|
TK_R_BRACE,
|
||||||
|
TK_L_BRACKET,
|
||||||
|
TK_R_BRACKET,
|
||||||
|
TK_COLON,
|
||||||
|
TK_COMMA,
|
||||||
|
TK_NULL,
|
||||||
|
TK_TRUE,
|
||||||
|
TK_FALSE,
|
||||||
|
TK_STRING_LITERAL,
|
||||||
|
TK_INTEGER_LITERAL,
|
||||||
|
TK_DOUBLE_LITERAL,
|
||||||
|
} token_type_t;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
void *no_val;
|
||||||
|
i64 num_int;
|
||||||
|
f64 num_frac;
|
||||||
|
} token_value_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
token_type_t type;
|
||||||
|
token_value_t value;
|
||||||
|
} token_t;
|
||||||
|
|
||||||
|
typedef struct lexer lexer_t;
|
||||||
|
|
||||||
|
bool validate_json(char *json);
|
||||||
|
|
||||||
|
#endif // !LEXER_STATES_H
|
@ -1,13 +0,0 @@
|
|||||||
#ifndef LEXER_STATES_H
|
|
||||||
#define LEXER_STATES_H
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define VALID_JSON true
|
|
||||||
#define INVALID_JSON false
|
|
||||||
|
|
||||||
typedef struct lexer lexer_t;
|
|
||||||
|
|
||||||
bool validate_json(char *json);
|
|
||||||
|
|
||||||
#endif // !LEXER_STATES_H
|
|
@ -1,5 +1,6 @@
|
|||||||
#include "lexer_states.h"
|
#include "lexer.h"
|
||||||
#include "aliases.h"
|
#include "aliases.h"
|
||||||
|
#include "dstring.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -10,6 +11,7 @@
|
|||||||
#define MAX_KEYWORD_LENGTH 5
|
#define MAX_KEYWORD_LENGTH 5
|
||||||
#define UNICODE_LENGTH 4
|
#define UNICODE_LENGTH 4
|
||||||
#define MAX_STACK_CAPACITY 1024
|
#define MAX_STACK_CAPACITY 1024
|
||||||
|
#define STRING_BUF_START_CAPACITY 1024
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
// GENERAL STATES
|
// GENERAL STATES
|
||||||
@ -76,12 +78,13 @@ typedef struct {
|
|||||||
} lexer_string_t;
|
} lexer_string_t;
|
||||||
|
|
||||||
struct lexer {
|
struct lexer {
|
||||||
lexer_state_t current;
|
|
||||||
state_stack_t stack;
|
|
||||||
u64 line;
|
u64 line;
|
||||||
u64 column;
|
u64 column;
|
||||||
|
lexer_state_t current;
|
||||||
|
state_stack_t stack;
|
||||||
lexer_string_t keyword;
|
lexer_string_t keyword;
|
||||||
lexer_string_t codepoint;
|
lexer_string_t codepoint;
|
||||||
|
dstr_t *current_string;
|
||||||
};
|
};
|
||||||
|
|
||||||
void stack_push(state_stack_t *stack, lexer_state_t value);
|
void stack_push(state_stack_t *stack, lexer_state_t value);
|
||||||
@ -123,6 +126,13 @@ bool validate_json(char *json) {
|
|||||||
lexer.current = LEXER_STATE_START;
|
lexer.current = LEXER_STATE_START;
|
||||||
lexer.keyword.type = LEXER_STRING_KEYWORD;
|
lexer.keyword.type = LEXER_STRING_KEYWORD;
|
||||||
lexer.codepoint.type = LEXER_STRING_UNICODE;
|
lexer.codepoint.type = LEXER_STRING_UNICODE;
|
||||||
|
lexer.current_string = dstr_with_capacity(STRING_BUF_START_CAPACITY);
|
||||||
|
|
||||||
|
if (!lexer.current_string) {
|
||||||
|
// TODO (Abdelrahman): This is fine for now, but it doesn't make sense to
|
||||||
|
// return INVALID_JSON if string allocation fails
|
||||||
|
return INVALID_JSON;
|
||||||
|
}
|
||||||
|
|
||||||
for (char *c = json; *c != '\0'; ++c) {
|
for (char *c = json; *c != '\0'; ++c) {
|
||||||
// printf("\nINPUT=>%s\n", c);
|
// printf("\nINPUT=>%s\n", c);
|
Loading…
Reference in New Issue
Block a user