From 7d974680a6a17e8c5e79d0de3abd1d02057ed50d Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Tue, 26 May 2026 03:56:30 +1000 Subject: [PATCH] Init Commit. --- Headers/slex_core.h | 56 ++++++++ README.md | 181 ++++++++++++++++++++++++ Source/Languages/C/slex_template.c | 7 + Source/Languages/CSharp/slex_template.c | 7 + Source/cli/main.c | 6 + Source/slex.c | 1 + bin/slex.exe | Bin 0 -> 50970 bytes build.sh | 20 +++ 8 files changed, 278 insertions(+) create mode 100644 Headers/slex_core.h create mode 100644 README.md create mode 100644 Source/Languages/C/slex_template.c create mode 100644 Source/Languages/CSharp/slex_template.c create mode 100644 Source/cli/main.c create mode 100644 Source/slex.c create mode 100644 bin/slex.exe create mode 100644 build.sh diff --git a/Headers/slex_core.h b/Headers/slex_core.h new file mode 100644 index 0000000..67c5c00 --- /dev/null +++ b/Headers/slex_core.h @@ -0,0 +1,56 @@ +#ifndef __SLEX_CORE_H_ +#define __SLEX_CORE_H_ +#include +#include +#include +typedef enum slex_target_language +{ + c_language, + csharp, +} slex_target_language; +typedef struct slex_options +{ + slex_target_language target_language; + char *header_output; + char *namespace_name; + char *class_name; + char *prefix; + char *data_type_name; +} slex_options; + +typedef struct slex_rule +{ + char *Tag; + char *Pattern; +} slex_rule; +typedef struct slex_mapping +{ + char *Id; + char *Tag; +} slex_mapping; + +typedef struct code_block +{ + slex_target_language target_languge; + char *post_processor_code; + char *variables; +} code_block; + +typedef struct slex_rules +{ + slex_rule *rules; + uint64_t rule_count; + slex_mapping *mappings; + uint64_t mapping_count; + code_block *code_blocks; + uint64_t code_block_count; +} slex_rules; + +bool slex_read_rule_from_file(FILE *f, slex_rules *output_rule); +bool slex_read_rule_from_cstr(char *content, slex_rules *output_rule); + +bool slex_translate_to_file_c(slex_options *options, slex_rules *rules, FILE *output_file); +bool slex_translate_to_file_csharp(slex_options *options, slex_rules *rules, FILE *output_file); +bool slex_translate_to_file(slex_options *options, slex_rules *rules, FILE *output_file); + +#endif \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad74ea4 --- /dev/null +++ b/README.md @@ -0,0 +1,181 @@ +# Simple Lexer + +Simple Lexer is a simple lexer that translate a lexer rule file into a target programming language source code. + +Currently, this project aims on supporting following platform/languages: + +|Language| Version| Platform| +|--------|--------|--------- | +|C | 99 | Win32, POSIX, ESP32 | +|C# | 9.0 | .netstandard2.1(all possible target platform, including Unity)| + +## Lexer Rule File Format + +``` +rule: + + + +... + +mapping: + + + +code: + +%% + +%post_processor +... +code for lang2 +... +post_processor% + +%variables +variables in post_processor accessible scope like state management. +variables% + + +%% +%post_processor +... +code for lang2 +... +post_processor% + +%variables +variables in post_processor accessible scope like state management. +variables% + +``` + +Code for each languages are for post-processing purpose only. +Code inside post_processor will directly replace staff inside `slex_post_process(...)` for each language. + +## Usage + +``` +slex [options] [options] + +input file usually ends with `.slex` + +Options: + +-o output file/output folder +-l specify target language, e.g: c, c#, csharp +-h
output header file (will separate output implementation and definitions when language is c or c++. Note: c++ is currently not supported.) +-ns specify namespace (supported languages only). Default is `slex_generated`, `SLexGenerated`, `io.creeperlv.slex.generated` for applicable language. +-class specify class name (supported languages only). Default is `slexer`, `SLexer`. +-prefix specify prefix for functions. Default is `slex_` for languages does not support namespace/class, `` (empty string) for languages support namespace/class. +-data_type specify the name of the segment data type. Different language have different default value: + +``` +## Data Type Name Table + +|Language| Type Name| +| - | - | +| C | slex_segment | +| C# | Segment | + +### Generated Lexer + +All usages here uses default settings + +#### C99 + +Default options: + +``` + -prefix slex_ -data_type slex_segment +``` + +Usage sample: +``` +void slex_sample(FILE* f, char* file_name){ + + struct slex_segment* head; + const char* str=""; + if(slex_file(f, file_name, &head)){ + //Success + } + slex_free(head); + if(slex_cstr(str, &head)){ + //Success + } + slex_free(head); +} +``` +API and defined data types: +```c +typedef struct slex_segment{ + char* head; + int64_t length; + char* file_name; + int64_t line; + int64_t col; + enmu slex_segment_tag; + enmu slex_segment_id; + struct slex_segment prev; + struct slex_segment next; +} slex_segment; + +typedef enmu slex_segment_tag{ + +}slex_segment_tag; +typedef enmu slex_segment_id{ + default, +}slex_segment_id; +char slex_file(FILE* f, char* file_name, slex_segment** head); +char slex_cstr(char* input, char* file_name, slex_segment** head); +char slex_free(slex_segment* head); +``` + +`slex_post_process` definition: + +```c + +typedef enum slex_post_process_result{ + slex_continue, + slex_skip, + slex_continue_with_output, +}slex_post_process_result; +slex_post_process_result slex_post_process(slex_segment* input, slex_segment** output); +``` + + +#### C# +Default options: + +``` + -ns SLexGenerated -class SLexer -data_type Segment -prefix "" + ``` + +##### APIs: +``` +namesapce SLexGenerated{ + public class SLexer{ + public bool SLex(FileInfo inputFile, out Segment Head); + public bool SLex(Stream inputStream, out Segment Head); + public bool SLex(string inputContent, out Segment Head); + private PostProcessResult slex_post_process(Segment Input,out Segment Output){ + //Default implementation: + Output=Input; + return PostProcessResult.Continue; + } + } + public enum PostProcessResult{ + Continue, + Skip, + ContinueWithOutput + } + public class Segment{ + public string Content; + public string FileName; + public Segment? Prev; + public Segment? Next; + public long Line; + public long Column; + } +} +``` diff --git a/Source/Languages/C/slex_template.c b/Source/Languages/C/slex_template.c new file mode 100644 index 0000000..a966708 --- /dev/null +++ b/Source/Languages/C/slex_template.c @@ -0,0 +1,7 @@ +#include "../../../Headers/slex_core.h" + +bool slex_translate_to_file_c(slex_options *options, slex_rules *rules, FILE *output_file) +{ + // TODO: Stub for moment. + return false; +} \ No newline at end of file diff --git a/Source/Languages/CSharp/slex_template.c b/Source/Languages/CSharp/slex_template.c new file mode 100644 index 0000000..a4f3669 --- /dev/null +++ b/Source/Languages/CSharp/slex_template.c @@ -0,0 +1,7 @@ +#include "../../../Headers/slex_core.h" + +bool slex_translate_to_file_csharp(slex_options *options, slex_rules *rules, FILE *output_file) +{ + // TODO: Stub for moment. + return false; +} \ No newline at end of file diff --git a/Source/cli/main.c b/Source/cli/main.c new file mode 100644 index 0000000..e29ad76 --- /dev/null +++ b/Source/cli/main.c @@ -0,0 +1,6 @@ +#include "../../Headers/slex_core.h" + +int main(int ac, char **av) +{ + return 0; +} \ No newline at end of file diff --git a/Source/slex.c b/Source/slex.c new file mode 100644 index 0000000..7972179 --- /dev/null +++ b/Source/slex.c @@ -0,0 +1 @@ +#include "../Headers/slex_core.h" \ No newline at end of file diff --git a/bin/slex.exe b/bin/slex.exe new file mode 100644 index 0000000000000000000000000000000000000000..9d989275bee6927bda87e6d7775928e161aa2871 GIT binary patch literal 50970 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 literal 0 HcmV?d00001 diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..418bc60 --- /dev/null +++ b/build.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +mkdir -p ./bin/ + +if [ -f "./env.sh" ]; +then + source ./env.sh +fi + +if [ -z "$CC" ]; +then + CC=cc +fi + +if [ -z "$SKIP_EXE" ]; +then + COMMAND="$CC ./Source/*.c ./Source/cli/*.c ./Source/Languages/*/*.c -o ./bin/slex" + echo "$COMMAND" + $COMMAND +fi