From 0e6c848fdf7082e771ff797cbc2488897b660695 Mon Sep 17 00:00:00 2001 From: Martin Michalec Date: Sun, 22 Feb 2026 06:17:28 +0300 Subject: add lexeme implementation --- include/cmmm/rs274ngc/lexeme.h | 89 ++++++++++++++++++++++++++++++++++++++++++ src/lexeme.c | 15 +++++++ 2 files changed, 104 insertions(+) create mode 100644 include/cmmm/rs274ngc/lexeme.h create mode 100644 src/lexeme.c diff --git a/include/cmmm/rs274ngc/lexeme.h b/include/cmmm/rs274ngc/lexeme.h new file mode 100644 index 0000000..c7efc45 --- /dev/null +++ b/include/cmmm/rs274ngc/lexeme.h @@ -0,0 +1,89 @@ +// include/cmmm/lexeme.h + +#ifndef INCLUDED__CMMM__RS274NGC__LEXEME__H +#define INCLUDED__CMMM__RS274NGC__LEXEME__H + +// #define CMMM__LEXEME__RS274NGC__STRIP_VENDOR + +#include +#include +#include "cmmm/string-view.h" + +#define CMMM__RS274NGC__LEXEME__KINDS() \ + X (COMMENT, ";[^\n]*|\\([^())]*\\)" ) \ + X (MODULO, "[Mm][ \t]*[Oo][ \t]*[Dd]" ) \ + X (NATURAL_LOG_OF, "[Ll][ \t]*[Nn]" ) \ + X (NON_EXCLUSIVE_OR, "[Oo][ \t]*[Rr]" ) \ + X (ABSOLUTE_VALUE, "[Aa][ \t]*[Bb][ \t]*[Ss]" ) \ + X (AND, "[Aa][ \t]*[Nn][ \t]*[Dd]" ) \ + X (ARC_COSINE, "[Aa][ \t]*[Cc][ \t]*[Oo][ \t]*[Ss]" ) \ + X (ARC_SINE, "[Aa][ \t]*[Ss][ \t]*[Ii][ \t]*[Nn]" ) \ + X (ARC_TANGENT, "[Aa][ \t]*[Tt][ \t]*[Aa][ \t]*[Nn]" ) \ + X (COSINE, "[Cc][ \t]*[Oo][ \t]*[Ss]" ) \ + X (EXCLUSIVE_OR, "[Xx][ \t]*[Oo][ \t]*[Rr]" ) \ + X (E_RAISED_TO, "[Ee][ \t]*[Xx][ \t]*[Pp]" ) \ + X (FIX_DOWN, "[Ff][ \t]*[Ii][ \t]*[Xx]" ) \ + X (FIX_UP, "[Ff][ \t]*[Uu][ \t]*[Pp]" ) \ + X (ROUND, "[Rr][ \t]*[Oo][ \t]*[Uu][ \t]*[Nn][ \t]*[Dd]") \ + X (SINE, "[Ss][ \t]*[Ii][ \t]*[Nn]" ) \ + X (SQUARE_ROOT, "[Ss][ \t]*[Qq][ \t]*[Rr][ \t]*[Tt]" ) \ + X (TANGENT, "[Tt][ \t]*[Aa][ \t]*[Nn]" ) \ + X (WORD_LETTER, "[ABCDFGHIJKLMPQRSTXYZabcdfghijklmpqrstxyz]" ) \ + X (REAL_NUMBER, "[0-9 \t]*(\\.[0-9 \t]+)?" ) \ + X (LINE_NUMBER, "[Nn][0-9 \t]+" ) \ + X (PARAMETER_SIGN, "#" ) \ + X (BRACKET_RIGHT, "\\]" ) \ + X (BRACKET_LEFT, "\\[" ) \ + X (EQUAL_SIGN, "=" ) \ + X (MINUS, "-" ) \ + X (PLUS, "\\+" ) \ + X (POWER, "\\*\\*" ) \ + X (TIMES, "\\*" ) \ + X (SLASH, "/" ) \ + +#ifndef CMMM__RS274NGC__LEXEME__STRIP_VENDOR +#define X(SYM, ...) CMMM__RS274NGC__LEXEME__KIND__##SYM, +#else +#define X(SYM, ...) \ + CMMM__RS274NGC__LEXEME__KIND__##SYM, \ + RS274NGC__LEXEME__KIND__##SYM = CMMM__RS274NGC__LEXEME__KIND__##SYM, +#endif // CMMM__RS274NGC__LEXEME__STRIP_VENDOR +enum cmmm__rs274ngc__lexeme__kind { + CMMM__RS274NGC__LEXEME__KIND__INVALID, + CMMM__RS274NGC__LEXEME__KIND__END_OF_LINE, + CMMM__RS274NGC__LEXEME__KIND__END_OF_FILE, + CMMM__RS274NGC__LEXEME__KINDS () + CMMM__RS274NGC__LEXEME__KIND_COUNT, +#ifdef CMMM__RS274NGC__LEXEME__STRIP_VENDOR + RS274NGC__LEXEME__KIND__INVALID = CMMM__RS274NGC__LEXEME__KIND__INVALID, + RS274NGC__LEXEME__KIND__END_OF_LINE = CMMM__RS274NGC__LEXEME__KIND__END_OF_LINE, + RS274NGC__LEXEME__KIND__END_OF_FILE = CMMM__RS274NGC__LEXEME__KIND__END_OF_FILE, + RS274NGC__LEXEME__KIND_COUNT = CMMM__RS274NGC__LEXEME__KIND_COUNT +#endif // CMMM__RS274NGC__LEXEME__STRIP_VENDOR +}; +#undef X + +#define CMMM__RS274NGC__LEXEME__REGEX_OFFSET 3 +#define CMMM__RS274NGC__LEXEME__REGEX_COUNT \ + (CMMM__RS274NGC__LEXEME__KIND_COUNT - CMMM__RS274NGC__LEXEME__REGEX_OFFSET) + +struct cmmm__rs274ngc__lexeme { + struct cmmm__string_view sv; + enum cmmm__rs274ngc__lexeme__kind kind; +}; + +extern const char *cmmm__rs274ngc__lexeme__kind_names[CMMM__RS274NGC__LEXEME__KIND_COUNT]; + +#ifdef CMMM__RS274NGC__LEXEME__STRIP_VENDOR +#define RS274NGC__LEXEME__STRIP_VENDOR CMMM__RS274NGC__LEXEME__STRIP_VENDOR +#define RS274NGC__LEXEME__KINDS CMMM__RS274NGC__LEXEME__KINDS +#define rs274ngc__lexeme__kind cmmm__rs274ngc__lexeme__kind +#define RS274NGC__LEXEME__REGEX_OFFSET CMMM__RS274NGC__LEXEME__REGEX_OFFSET +#define RS274NGC__LEXEME__REGEX_COUNT CMMM__RS274NGC__LEXEME__REGEX_COUNT +#define rs274ngc__lexeme cmmm__rs274ngc__lexeme +#define rs274ngc__lexeme__kind_names cmmm__rs274ngc__lexeme__kind_names +#endif // CMMM__RS274NGC__LEXEME__STRIP_VENDOR + +#endif // INCLUDED__RS274NGC__LEXEME__H + +// include/cmmm/lexeme.h ends here diff --git a/src/lexeme.c b/src/lexeme.c new file mode 100644 index 0000000..7da5662 --- /dev/null +++ b/src/lexeme.c @@ -0,0 +1,15 @@ +// src/lexeme.c + +#define CMMM__RS274NGC__LEXEME__STRIP_VENDOR +#include "cmmm/rs274ngc/lexeme.h" + +#define X(SYM, ...) [RS274NGC__LEXEME__KIND__##SYM] = #SYM, +const char *rs274ngc__lexeme__kind_names[RS274NGC__LEXEME__KIND_COUNT] = { + [RS274NGC__LEXEME__KIND__INVALID ] = "INVALID", + [RS274NGC__LEXEME__KIND__END_OF_LINE] = "END_OF_LINE", + [RS274NGC__LEXEME__KIND__END_OF_FILE] = "END_OF_FILE", + RS274NGC__LEXEME__KINDS () +}; +#undef X + +// src/lexeme.c ends here -- cgit v1.3