diff --git a/.gitignore b/.gitignore index 0bcc76f..8fed91e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +.cache *.dSYM src/ignore/**/* diff --git a/build b/build new file mode 100644 index 0000000..8e1e5c1 --- /dev/null +++ b/build @@ -0,0 +1,3 @@ +#!/bin/bash + +bear -- ./compile diff --git a/compile b/compile new file mode 100644 index 0000000..7641533 --- /dev/null +++ b/compile @@ -0,0 +1,12 @@ +#!/bin/bash + +CC=clang +CFLAGS="-g -Wall -Werror -pedantic -Iinclude" +SRC="src/main.c" +OUT=main + +# LEXER +CFLAGS+=" -Iinclude/lexer" +SRC+=" src/lexer/*.c" + +$CC $CFLAGS $SRC -o $OUT diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..0e1c4b3 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,682 @@ +[ + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/main.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/array_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/array_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/keyword_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/keyword_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/lexer_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/num_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/num_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/obj_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/obj_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/string_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/string_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/value_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/value_states.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/main-3a4e7b.o", + "src/main.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c", + "output": "/tmp/main-3a4e7b.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/array_states-ba3bba.o", + "src/lexer/array_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/array_states.c", + "output": "/tmp/array_states-ba3bba.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/keyword_states-0752de.o", + "src/lexer/keyword_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/keyword_states.c", + "output": "/tmp/keyword_states-0752de.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/lexer_states-b5dca0.o", + "src/lexer/lexer_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", + "output": "/tmp/lexer_states-b5dca0.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/num_states-f8ad26.o", + "src/lexer/num_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/num_states.c", + "output": "/tmp/num_states-f8ad26.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/obj_states-9ef381.o", + "src/lexer/obj_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/obj_states.c", + "output": "/tmp/obj_states-9ef381.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/string_states-c65204.o", + "src/lexer/string_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/string_states.c", + "output": "/tmp/string_states-c65204.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/value_states-016fa1.o", + "src/lexer/value_states.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/value_states.c", + "output": "/tmp/value_states-016fa1.o" + } +] diff --git a/include/aliases.h b/include/aliases.h new file mode 100644 index 0000000..d7e7807 --- /dev/null +++ b/include/aliases.h @@ -0,0 +1,26 @@ +#ifndef ALIASES_H +#define ALIASES_H + +#include + +#define u8 uint8_t +#define u16 uint16_t +#define u32 uint32_t +#define u64 uint64_t + +#define i8 int8_t +#define i16 int16_t +#define i32 int32_t +#define i64 int64_t + +#define f32 float +#define f64 double + +#define INTERNAL static +#define PERSISTENT static + +#ifdef __cplusplus +#define CLASS_MEMBER static +#endif // __cplusplus + +#endif // !ALIASES_H diff --git a/include/lexer/lexer_states.h b/include/lexer/lexer_states.h new file mode 100644 index 0000000..8da7e5b --- /dev/null +++ b/include/lexer/lexer_states.h @@ -0,0 +1,6 @@ +#ifndef LEXER_STATES_H +#define LEXER_STATES_H + +typedef struct lexer lexer_t; + +#endif // !LEXER_STATES_H diff --git a/main b/main new file mode 100644 index 0000000..6eb31c6 Binary files /dev/null and b/main differ diff --git a/src/lexer/lexer_states.c b/src/lexer/lexer_states.c new file mode 100644 index 0000000..98e1224 --- /dev/null +++ b/src/lexer/lexer_states.c @@ -0,0 +1,154 @@ +#include "lexer_states.h" +#include "aliases.h" +#include + +// clang-format off +typedef enum { + // GENERAL STATES + LEXER_STATE_START, + LEXER_STATE_SUCCESS, + LEXER_STATE_ERROR, + LEXER_STATE_VALUE, + LEXER_STATE_KEYWORD, + // COLLECTION STATES + LEXER_STATE_OBJECT, + LEXER_STATE_ARRAY, + // OBJECT STATES + LEXER_STATE_KEY_START, + LEXER_STATE_KEY_END, + // NUMBER STATES + LEXER_STATE_NUMBER_START, + LEXER_STATE_DECIMAL, + LEXER_STATE_NUMBER, + LEXER_STATE_FRACTION, + LEXER_STATE_EXPONENT, + LEXER_STATE_EXP_SIGN, + LEXER_STATE_POWER, + LEXER_STATE_NUMBER_END, + // STRING STATES + LEXER_STATE_STRING, + LEXER_STATE_ESCAPE_SEQUENCE, + LEXER_STATE_UNICODE_HEX, + + COUNT_LEXER_STATES, +} lexer_state_t; +// clang-format on + +struct lexer { + lexer_state_t current; + u64 line; + u64 column; +}; + +void lexer_state_machine(lexer_t *lexer, char input); +lexer_state_t handle_lexer_start(char input); +lexer_state_t handle_object(char input); +lexer_state_t handle_character(char input); +lexer_state_t handle_escape_sequence(char input); + +void lexer_state_machine(lexer_t *lexer, char input) { + switch (lexer->current) { + case LEXER_STATE_START: + lexer->current = handle_lexer_start(input); + break; + case LEXER_STATE_SUCCESS: + break; + case LEXER_STATE_ERROR: + break; + case LEXER_STATE_VALUE: + break; + case LEXER_STATE_KEYWORD: + break; + case LEXER_STATE_OBJECT: + lexer->current = handle_object(input); + break; + case LEXER_STATE_ARRAY: + lexer->current = LEXER_STATE_VALUE; + break; + case LEXER_STATE_KEY_START: + lexer->current = LEXER_STATE_STRING; + break; + case LEXER_STATE_KEY_END: + break; + case LEXER_STATE_NUMBER_START: + break; + case LEXER_STATE_DECIMAL: + break; + case LEXER_STATE_NUMBER: + break; + case LEXER_STATE_FRACTION: + break; + case LEXER_STATE_EXPONENT: + break; + case LEXER_STATE_EXP_SIGN: + break; + case LEXER_STATE_POWER: + break; + case LEXER_STATE_NUMBER_END: + break; + case LEXER_STATE_STRING: + lexer->current = handle_character(input); + break; + case LEXER_STATE_ESCAPE_SEQUENCE: + lexer->current = handle_escape_sequence(input); + break; + case LEXER_STATE_UNICODE_HEX: + break; + default: + lexer->current = LEXER_STATE_ERROR; + } +} + +lexer_state_t handle_lexer_start(char input) { + if (isspace(input)) { + return LEXER_STATE_START; + } + + switch (input) { + case '{': + return LEXER_STATE_OBJECT; + case '[': + return LEXER_STATE_ARRAY; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_object(char input) { + if (isspace(input)) { + return LEXER_STATE_OBJECT; + } else if (input == '"') { + return LEXER_STATE_KEY_START; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_character(char input) { + switch (input) { + case '\\': + return LEXER_STATE_ESCAPE_SEQUENCE; + case '"': + return LEXER_STATE_STRING; // WHAT TO RETURN HERE? + } + + return LEXER_STATE_STRING; +} + +lexer_state_t handle_escape_sequence(char input) { + switch (input) { + case '"': + case '/': + case '\\': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + return LEXER_STATE_STRING; + case 'u': + return LEXER_STATE_UNICODE_HEX; + } + + return LEXER_STATE_ERROR; +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..f9785f8 --- /dev/null +++ b/src/main.c @@ -0,0 +1,3 @@ +#include + +int main(int argc, char *argv[]) { return EXIT_SUCCESS; }