SCF_LEX_WORD_BIT_NOT, // ~
SCF_LEX_WORD_BIT_XOR, // ^
- SCF_LEX_WORD_LOGIC_AND, // &&
- SCF_LEX_WORD_LOGIC_OR, // ||
- SCF_LEX_WORD_LOGIC_NOT, // !
+ SCF_LEX_WORD_LOGIC_AND, // &&
+ SCF_LEX_WORD_LOGIC_OR, // ||
+ SCF_LEX_WORD_LOGIC_NOT, // !
- SCF_LEX_WORD_ASSIGN, // = assign
+ SCF_LEX_WORD_ASSIGN, // = assign
SCF_LEX_WORD_ADD_ASSIGN, // +=
SCF_LEX_WORD_SUB_ASSIGN, // -=
SCF_LEX_WORD_MUL_ASSIGN, // *=
SCF_LEX_WORD_BIT_OR_ASSIGN, // |=
SCF_LEX_WORD_BIT_XOR_ASSIGN, // ^=
- SCF_LEX_WORD_LT, // < less than
- SCF_LEX_WORD_GT, // > greater than
+ SCF_LEX_WORD_LT, // < less than
+ SCF_LEX_WORD_GT, // > greater than
- SCF_LEX_WORD_EQ, // == equal
- SCF_LEX_WORD_NE, // != not equal
- SCF_LEX_WORD_LE, // <= less equal
- SCF_LEX_WORD_GE, // >= greater equal
+ SCF_LEX_WORD_EQ, // == equal
+ SCF_LEX_WORD_NE, // != not equal
+ SCF_LEX_WORD_LE, // <= less equal
+ SCF_LEX_WORD_GE, // >= greater equal
- SCF_LEX_WORD_LS, // [ left square brackets
- SCF_LEX_WORD_RS, // ] right square brackets
+ SCF_LEX_WORD_LS, // [ left square brackets
+ SCF_LEX_WORD_RS, // ] right square brackets
- SCF_LEX_WORD_LP, // ( left parentheses
- SCF_LEX_WORD_RP, // ) right parentheses
+ SCF_LEX_WORD_LP, // ( left parentheses
+ SCF_LEX_WORD_RP, // ) right parentheses
SCF_LEX_WORD_LA, // << left angle brackets
SCF_LEX_WORD_RA, // >> right angle brackets
SCF_LEX_WORD_EOF, // EOF
// key words
- SCF_LEX_WORD_KEY_IF, // if
- SCF_LEX_WORD_KEY_ELSE, // else
+ SCF_LEX_WORD_KEY_IF, // if
+ SCF_LEX_WORD_KEY_ELSE, // else
SCF_LEX_WORD_KEY_FOR, // for
SCF_LEX_WORD_KEY_DO, // do
SCF_LEX_WORD_KEY_CONTINUE, // continue
SCF_LEX_WORD_KEY_GOTO, // goto
- SCF_LEX_WORD_KEY_SWITCH, // switch
- SCF_LEX_WORD_KEY_CASE, // case
- SCF_LEX_WORD_KEY_DEFAULT, // default
+ SCF_LEX_WORD_KEY_SWITCH, // switch
+ SCF_LEX_WORD_KEY_CASE, // case
+ SCF_LEX_WORD_KEY_DEFAULT, // default
SCF_LEX_WORD_KEY_RETURN, // return
SCF_LEX_WORD_ASM_ASCIZ, // .asciz
// data types
- SCF_LEX_WORD_KEY_CHAR, // char
+ SCF_LEX_WORD_KEY_CHAR, // char
SCF_LEX_WORD_KEY_SHORT, // short
SCF_LEX_WORD_KEY_INT, // int
--- /dev/null
+int printf(const char* fmt, ...);
+
+enum scf_lex_words
+{
+ SCF_LEX_WORD_PLUS = 0, // +
+ SCF_LEX_WORD_MINUS, // -
+ SCF_LEX_WORD_STAR, // *
+ SCF_LEX_WORD_DIV, // / div
+ SCF_LEX_WORD_MOD, // %
+
+ SCF_LEX_WORD_INC, // ++
+ SCF_LEX_WORD_DEC, // --
+
+ SCF_LEX_WORD_SHL, // <<
+ SCF_LEX_WORD_SHR, // >>
+
+ SCF_LEX_WORD_BIT_AND, // &
+ SCF_LEX_WORD_BIT_OR, // |
+ SCF_LEX_WORD_BIT_NOT, // ~
+ SCF_LEX_WORD_BIT_XOR, // ^
+
+ SCF_LEX_WORD_LOGIC_AND, // &&
+ SCF_LEX_WORD_LOGIC_OR, // ||
+ SCF_LEX_WORD_LOGIC_NOT, // !
+
+ SCF_LEX_WORD_ASSIGN, // = assign
+ SCF_LEX_WORD_ADD_ASSIGN, // +=
+ SCF_LEX_WORD_SUB_ASSIGN, // -=
+ SCF_LEX_WORD_MUL_ASSIGN, // *=
+ SCF_LEX_WORD_DIV_ASSIGN, // /=
+ SCF_LEX_WORD_MOD_ASSIGN, // %=
+ SCF_LEX_WORD_SHL_ASSIGN, // <<=
+ SCF_LEX_WORD_SHR_ASSIGN, // >>=
+ SCF_LEX_WORD_BIT_AND_ASSIGN, // &=
+ SCF_LEX_WORD_BIT_OR_ASSIGN, // |=
+ SCF_LEX_WORD_BIT_XOR_ASSIGN, // ^=
+
+ SCF_LEX_WORD_LT, // < less than
+ SCF_LEX_WORD_GT, // > greater than
+
+ SCF_LEX_WORD_EQ, // == equal
+ SCF_LEX_WORD_NE, // != not equal
+ SCF_LEX_WORD_LE, // <= less equal
+ SCF_LEX_WORD_GE, // >= greater equal
+
+ SCF_LEX_WORD_LS, // [ left square brackets
+ SCF_LEX_WORD_RS, // ] right square brackets
+
+ SCF_LEX_WORD_LP, // ( left parentheses
+ SCF_LEX_WORD_RP, // ) right parentheses
+
+ SCF_LEX_WORD_LA, // << left angle brackets
+ SCF_LEX_WORD_RA, // >> right angle brackets
+
+ SCF_LEX_WORD_KEY_SIZEOF, // sizeof
+ SCF_LEX_WORD_KEY_TYPEOF, // typeof
+ SCF_LEX_WORD_KEY_NEW, // create class object
+ SCF_LEX_WORD_KEY_CONTAINER, // container_of
+ SCF_LEX_WORD_KEY_VA_ARG, // va_arg
+ SCF_LEX_WORD_KEY_VA_COPY, // va_copy
+ SCF_LEX_WORD_KEY_DEFINED, // #defined
+
+ SCF_LEX_WORD_Q_MASK, // ?
+ SCF_LEX_WORD_COLON, // : colon
+
+ SCF_LEX_WORD_ARROW, // -> arrow
+ SCF_LEX_WORD_DOT, // . dot
+
+ SCF_LEX_N_OPS, // number of operators
+
+ SCF_LEX_WORD_RANGE, // .. range
+ SCF_LEX_WORD_VA_ARGS, // ... variable args
+
+ SCF_LEX_WORD_LB, // { left brace
+ SCF_LEX_WORD_RB, // } right brace
+
+ SCF_LEX_WORD_LF, // '\n', line feed, LF
+ SCF_LEX_WORD_HASH, // # hash
+ SCF_LEX_WORD_HASH2, // ## hash2
+ SCF_LEX_WORD_DOLLAR, // $ dollar
+
+ SCF_LEX_WORD_COMMA, // , comma
+ SCF_LEX_WORD_SEMICOLON, // ;
+ SCF_LEX_WORD_SPACE, // ' ' space
+
+ // eof
+ SCF_LEX_WORD_EOF, // EOF
+
+ // key words
+ SCF_LEX_WORD_KEY_IF, // if
+ SCF_LEX_WORD_KEY_ELSE, // else
+
+ SCF_LEX_WORD_KEY_FOR, // for
+ SCF_LEX_WORD_KEY_DO, // do
+ SCF_LEX_WORD_KEY_WHILE, // while
+
+ SCF_LEX_WORD_KEY_BREAK, // break
+ SCF_LEX_WORD_KEY_CONTINUE, // continue
+ SCF_LEX_WORD_KEY_GOTO, // goto
+
+ SCF_LEX_WORD_KEY_SWITCH, // switch
+ SCF_LEX_WORD_KEY_CASE, // case
+ SCF_LEX_WORD_KEY_DEFAULT, // default
+
+ SCF_LEX_WORD_KEY_RETURN, // return
+
+ SCF_LEX_WORD_KEY_OPERATOR, // operator
+ SCF_LEX_WORD_KEY_UNDERLINE, // _ underline
+
+ // macro key word
+ SCF_LEX_WORD_KEY_INCLUDE, // #include
+ SCF_LEX_WORD_KEY_DEFINE, // #define
+ SCF_LEX_WORD_KEY_UNDEF, // #undef
+
+ SCF_LEX_WORD_KEY_ERROR, // #error
+ SCF_LEX_WORD_KEY_LINE, // #line
+ SCF_LEX_WORD_KEY_PRAGMA, // #pragma
+
+ SCF_LEX_WORD_KEY_IFDEF, // #ifdef
+ SCF_LEX_WORD_KEY_IFNDEF, // #ifndef
+ SCF_LEX_WORD_KEY_ELIF, // #elif
+ SCF_LEX_WORD_KEY_ENDIF, // #endif
+
+ // asm key word
+ SCF_LEX_WORD_ASM_TEXT, // .text
+ SCF_LEX_WORD_ASM_DATA, // .data
+ SCF_LEX_WORD_ASM_GLOBAL, // .global
+ SCF_LEX_WORD_ASM_ALIGN, // .align
+ SCF_LEX_WORD_ASM_ORG, // .org
+
+ SCF_LEX_WORD_ASM_FILL, // .fill
+ SCF_LEX_WORD_ASM_BYTE, // .byte
+ SCF_LEX_WORD_ASM_WORD, // .word
+ SCF_LEX_WORD_ASM_LONG, // .long
+ SCF_LEX_WORD_ASM_QUAD, // .quad
+ SCF_LEX_WORD_ASM_ASCII, // .ascii
+ SCF_LEX_WORD_ASM_ASCIZ, // .asciz
+
+ // data types
+ SCF_LEX_WORD_KEY_CHAR, // char
+
+ SCF_LEX_WORD_KEY_SHORT, // short
+ SCF_LEX_WORD_KEY_INT, // int
+ SCF_LEX_WORD_KEY_LONG, // long
+
+ SCF_LEX_WORD_KEY_SIGNED, // signed
+ SCF_LEX_WORD_KEY_UNSIGNED, // unsigned
+
+ SCF_LEX_WORD_KEY_FLOAT, // float
+ SCF_LEX_WORD_KEY_DOUBLE, // double
+
+ SCF_LEX_WORD_KEY_INT1, // int1_t
+ SCF_LEX_WORD_KEY_INT2, // int2_t
+ SCF_LEX_WORD_KEY_INT3, // int3_t
+ SCF_LEX_WORD_KEY_INT4, // int4_t
+
+ SCF_LEX_WORD_KEY_BIT, // bit
+ SCF_LEX_WORD_KEY_BIT2, // bit2_t
+ SCF_LEX_WORD_KEY_BIT3, // bit3_t
+ SCF_LEX_WORD_KEY_BIT4, // bit4_t
+
+ SCF_LEX_WORD_KEY_VOID, // void
+
+ SCF_LEX_WORD_KEY_VA_START, // va_start
+ SCF_LEX_WORD_KEY_VA_END, // va_end
+
+ SCF_LEX_WORD_KEY_CLASS, // class
+ SCF_LEX_WORD_KEY_TYPEDEF, // typedef
+
+ SCF_LEX_WORD_KEY_CONST, // const
+ SCF_LEX_WORD_KEY_STATIC, // static
+ SCF_LEX_WORD_KEY_EXTERN, // extern
+ SCF_LEX_WORD_KEY_INLINE, // inline
+ SCF_LEX_WORD_KEY_VOLATILE, // volatile
+
+ // for co-routine
+ SCF_LEX_WORD_KEY_ASYNC, // async
+ SCF_LEX_WORD_KEY_AWAIT, // await
+
+ SCF_LEX_WORD_KEY_ENUM, // enum
+ SCF_LEX_WORD_KEY_UNION, // union
+ SCF_LEX_WORD_KEY_STRUCT, // struct
+
+ SCF_LEX_WORD_KEY_VAR, // var
+
+ // const literal value
+ SCF_LEX_WORD_CONST_CHAR,
+ SCF_LEX_WORD_CONST_WCHAR,
+
+ SCF_LEX_WORD_CONST_INT,
+ SCF_LEX_WORD_CONST_U32,
+ SCF_LEX_WORD_CONST_I64,
+ SCF_LEX_WORD_CONST_U64,
+
+ SCF_LEX_WORD_CONST_FLOAT,
+ SCF_LEX_WORD_CONST_DOUBLE,
+ SCF_LEX_WORD_CONST_COMPLEX,
+
+ SCF_LEX_WORD_CONST_WSTRING,
+ SCF_LEX_WORD_CONST_STRING,
+
+ SCF_LEX_WORD_ID, // identity, start of _, a-z, A-Z, may include 0-9
+};
+
+#define SCF_CSTR(_cstr) (_cstr), (sizeof(_cstr) - 1)
+
+typedef struct {
+ char* text;
+ int len;
+ int type;
+} scf_key_word_t;
+
+static scf_key_word_t macro_key_words[] =
+{
+ {SCF_CSTR("include"), SCF_LEX_WORD_KEY_INCLUDE},
+ {SCF_CSTR("define"), SCF_LEX_WORD_KEY_DEFINE},
+
+ {SCF_CSTR("ifndef"), SCF_LEX_WORD_KEY_IFNDEF},
+ {SCF_CSTR("ifdef"), SCF_LEX_WORD_KEY_IFDEF},
+
+ {SCF_CSTR("if"), SCF_LEX_WORD_KEY_IF},
+ {SCF_CSTR("else"), SCF_LEX_WORD_KEY_ELSE},
+ {SCF_CSTR("elif"), SCF_LEX_WORD_KEY_ELIF},
+ {SCF_CSTR("endif"), SCF_LEX_WORD_KEY_ENDIF},
+
+ {SCF_CSTR("undef"), SCF_LEX_WORD_KEY_UNDEF},
+
+ {SCF_CSTR("pragma"), SCF_LEX_WORD_KEY_PRAGMA},
+ {SCF_CSTR("line"), SCF_LEX_WORD_KEY_LINE},
+ {SCF_CSTR("error"), SCF_LEX_WORD_KEY_ERROR},
+};
+
+static scf_key_word_t key_words[] =
+{
+ {SCF_CSTR("if"), SCF_LEX_WORD_KEY_IF},
+ {SCF_CSTR("else"), SCF_LEX_WORD_KEY_ELSE},
+
+ {SCF_CSTR("for"), SCF_LEX_WORD_KEY_FOR},
+ {SCF_CSTR("while"), SCF_LEX_WORD_KEY_WHILE},
+ {SCF_CSTR("do"), SCF_LEX_WORD_KEY_DO},
+
+ {SCF_CSTR("break"), SCF_LEX_WORD_KEY_BREAK},
+ {SCF_CSTR("continue"), SCF_LEX_WORD_KEY_CONTINUE},
+ {SCF_CSTR("goto"), SCF_LEX_WORD_KEY_GOTO},
+
+ {SCF_CSTR("switch"), SCF_LEX_WORD_KEY_SWITCH},
+ {SCF_CSTR("case"), SCF_LEX_WORD_KEY_CASE},
+ {SCF_CSTR("default"), SCF_LEX_WORD_KEY_DEFAULT},
+
+ {SCF_CSTR("return"), SCF_LEX_WORD_KEY_RETURN},
+
+ {SCF_CSTR("sizeof"), SCF_LEX_WORD_KEY_SIZEOF},
+ {SCF_CSTR("typeof"), SCF_LEX_WORD_KEY_TYPEOF},
+
+ {SCF_CSTR("new"), SCF_LEX_WORD_KEY_NEW},
+ {SCF_CSTR("operator"), SCF_LEX_WORD_KEY_OPERATOR},
+
+ {SCF_CSTR("_"), SCF_LEX_WORD_KEY_UNDERLINE},
+
+ {SCF_CSTR("char"), SCF_LEX_WORD_KEY_CHAR},
+
+ {SCF_CSTR("short"), SCF_LEX_WORD_KEY_SHORT},
+ {SCF_CSTR("int"), SCF_LEX_WORD_KEY_INT},
+ {SCF_CSTR("long"), SCF_LEX_WORD_KEY_LONG},
+
+ {SCF_CSTR("signed"), SCF_LEX_WORD_KEY_SIGNED},
+ {SCF_CSTR("unsigned"), SCF_LEX_WORD_KEY_UNSIGNED},
+
+ {SCF_CSTR("float"), SCF_LEX_WORD_KEY_FLOAT},
+ {SCF_CSTR("double"), SCF_LEX_WORD_KEY_DOUBLE},
+
+ {SCF_CSTR("bit"), SCF_LEX_WORD_KEY_BIT},
+ {SCF_CSTR("bit2_t"), SCF_LEX_WORD_KEY_BIT2},
+ {SCF_CSTR("bit3_t"), SCF_LEX_WORD_KEY_BIT3},
+ {SCF_CSTR("bit4_t"), SCF_LEX_WORD_KEY_BIT4},
+
+ {SCF_CSTR("int1_t"), SCF_LEX_WORD_KEY_INT1},
+ {SCF_CSTR("int2_t"), SCF_LEX_WORD_KEY_INT2},
+ {SCF_CSTR("int3_t"), SCF_LEX_WORD_KEY_INT3},
+ {SCF_CSTR("int4_t"), SCF_LEX_WORD_KEY_INT4},
+
+ {SCF_CSTR("void"), SCF_LEX_WORD_KEY_VOID},
+
+ {SCF_CSTR("container"), SCF_LEX_WORD_KEY_CONTAINER},
+
+ {SCF_CSTR("class"), SCF_LEX_WORD_KEY_CLASS},
+ {SCF_CSTR("typedef"), SCF_LEX_WORD_KEY_TYPEDEF},
+
+ {SCF_CSTR("const"), SCF_LEX_WORD_KEY_CONST},
+ {SCF_CSTR("static"), SCF_LEX_WORD_KEY_STATIC},
+ {SCF_CSTR("extern"), SCF_LEX_WORD_KEY_EXTERN},
+ {SCF_CSTR("inline"), SCF_LEX_WORD_KEY_INLINE},
+ {SCF_CSTR("volatile"), SCF_LEX_WORD_KEY_VOLATILE},
+
+ {SCF_CSTR("async"), SCF_LEX_WORD_KEY_ASYNC},
+ {SCF_CSTR("await"), SCF_LEX_WORD_KEY_AWAIT},
+
+ {SCF_CSTR("enum"), SCF_LEX_WORD_KEY_ENUM},
+ {SCF_CSTR("union"), SCF_LEX_WORD_KEY_UNION},
+ {SCF_CSTR("struct"), SCF_LEX_WORD_KEY_STRUCT},
+
+ {SCF_CSTR(".text"), SCF_LEX_WORD_ASM_TEXT},
+ {SCF_CSTR(".data"), SCF_LEX_WORD_ASM_DATA},
+ {SCF_CSTR(".global"), SCF_LEX_WORD_ASM_GLOBAL},
+ {SCF_CSTR(".align"), SCF_LEX_WORD_ASM_ALIGN},
+ {SCF_CSTR(".org"), SCF_LEX_WORD_ASM_ORG},
+
+ {SCF_CSTR(".fill"), SCF_LEX_WORD_ASM_FILL},
+ {SCF_CSTR(".byte"), SCF_LEX_WORD_ASM_BYTE},
+ {SCF_CSTR(".word"), SCF_LEX_WORD_ASM_WORD},
+ {SCF_CSTR(".long"), SCF_LEX_WORD_ASM_LONG},
+ {SCF_CSTR(".quad"), SCF_LEX_WORD_ASM_QUAD},
+ {SCF_CSTR(".ascii"), SCF_LEX_WORD_ASM_ASCII},
+ {SCF_CSTR(".asciz"), SCF_LEX_WORD_ASM_ASCIZ},
+
+ {SCF_CSTR("__builtin_va_start"), SCF_LEX_WORD_KEY_VA_START},
+ {SCF_CSTR("__builtin_va_arg"), SCF_LEX_WORD_KEY_VA_ARG},
+ {SCF_CSTR("__builtin_va_copy"), SCF_LEX_WORD_KEY_VA_COPY},
+ {SCF_CSTR("__builtin_va_end"), SCF_LEX_WORD_KEY_VA_END},
+};
+
+int main()
+{
+ scf_key_word_t* w;
+ int i;
+
+ for (i = 0; i < sizeof(macro_key_words) / sizeof(macro_key_words[0]); i++) {
+ w = ¯o_key_words[i];
+
+ printf("i: %d, text: %s, len: %d, type: %d\n", i, w->text, w->len, w->type);
+ }
+
+ for (i = 0; i < sizeof(key_words) / sizeof(key_words[0]); i++) {
+ w = &key_words[i];
+
+ printf("i: %d, text: %s, len: %d, type: %d\n", i, w->text, w->len, w->type);
+ }
+
+ return 0;
+}