lang-bootstrap/06/Lexer.lua
Dawid Sobczak e6b88d5a0f Add stage 06: Lua bootstrap
The goal of stage 06 is to try parse zig synax in lua. I pulled in
lpeglable 1.2.0 and parser-gen off github to get started. All of this
needs to be cleaned up rather soon.

Lua boostraps using tcc and musl from the previous stage. Since musl
0.6.0 doesn't support dynamic linking this build of lua doesn't support
shared libraries. I couldn't easily patch musl with dlopen and friends
so instead I link statically and call deps with c api.
2023-07-06 12:32:47 +01:00

128 lines
No EOL
10 KiB
Lua

Reverse = {
"addrspace", "align", "allowzero", "and", "anyframe", "anytype", "asm", "async",
"await", "break", "callconv", "catch", "comptime", "const", "continue", "defer",
"else", "enum", "errdefer", "error", "export", "extern", "fn", "for", "if",
"inline", "noalias", "noinline", "IDENTIFIER", "nosuspend", "opaque", "or",
"orelse", "packed", "pub", "resume", "return", "linksection", "struct", "suspend",
"switch", "test", "threadlocal", "try", "union", "unreachable", "usingnamespace",
"var", "volatile", "while", "INVALID", ".**", "!", "|", "||", "|=", "=", "==",
"=>", "!=", "(", ")", ";", "%", "%=", "{", "}", "[", "]", ".", ".*", "..", "...",
"^", "^=", "+", "++", "+=", "+%", "+%=", "+|", "+|=", "-", "-=", "-%", "-%=", "-|",
"-|=", "*", "*=", "**", "*%", "*%=", "*|", "*|=", "->", ":", "/", "/=", ",", "&",
"&=", "?", "<", "<=", "<<", "<<=", "<<|", "<<|=", ">", ">=", ">>", ">>=", "~",
"STRING_LITERAL", "CHAR_LITERAL", "EOF", "BUILTIN", "NUMBER_LITERAL", "DOC_COMMENT",
"CONTAINER_DOC_COMMENT",
}
Tokens = {
ADDRSPACE = 1, ALIGN = 2,
ALLOWZERO = 3, AND = 4,
ANYFRAME = 5, ANYTYPE = 6,
ASM = 7, ASYNC = 8,
AWAIT = 9, BREAK = 10,
CALLCONV = 11, CATCH = 12,
COMPTIME = 13, CONST = 14,
CONTINUE = 15, DEFER = 16,
ELSE = 17, ENUM = 18,
ERRDEFER = 19, ERROR = 20,
EXPORT = 21, EXTERN = 22,
FN = 23, FOR = 24,
IF = 25, INLINE = 26,
NOALIAS = 27, NOINLINE = 28,
IDENTIFIER = 29, NOSUSPEND = 30,
OPAQUE = 31, OR = 32,
ORELSE = 33, PACKED = 34,
PUB = 35, RESUME = 36,
RETURN = 37, LINKSECTION = 38,
STRUCT = 39, SUSPEND = 40,
SWITCH = 41, TEST = 42,
THREADLOCAL = 43, TRY = 44,
UNION = 45, UNREACHABLE = 46,
USINGNAMESPACE = 47, VAR = 48,
VOLATILE = 49, WHILE = 50,
INVALID = 51, INVALID_PERIODASTERISKS = 52,
BANG = 53, PIPE = 54,
PIPE_PIPE = 55, PIPE_EQUAL = 56,
EQUAL = 57, EQUAL_EQUAL = 58,
EQUAL_ANGLE_BRACKET_RIGHT = 59, BANG_EQUAL = 60,
L_PAREN = 61, R_PAREN = 62,
SEMICOLON = 63, PERCENT = 64,
PERCENT_EQUAL = 65, L_BRACE = 66,
R_BRACE = 67, L_BRACKET = 68,
R_BRACKET = 69, PERIOD = 70,
PERIOD_ASTERISK = 71, ELLIPSIS2 = 72,
ELLIPSIS3 = 73, CARET = 74,
CARET_EQUAL = 75, PLUS = 76,
PLUS_PLUS = 77, PLUS_EQUAL = 78,
PLUS_PERCENT = 79, PLUS_PERCENT_EQUAL = 80,
PLUS_PIPE = 81, PLUS_PIPE_EQUAL = 82,
MINUS = 83, MINUS_EQUAL = 84,
MINUS_PERCENT = 85, MINUS_PERCENT_EQUAL = 86,
MINUS_PIPE = 87, MINUS_PIPE_EQUAL = 88,
ASTERISK = 89, ASTERISK_EQUAL = 90,
ASTERISK_ASTERISK = 91, ASTERISK_PERCENT = 92,
ASTERISK_PERCENT_EQUAL = 93, ASTERISK_PIPE = 94,
ASTERISK_PIPE_EQUAL = 95, ARROW = 96,
COLON = 97, SLASH = 98,
SLASH_EQUAL = 99, COMMA = 100,
AMPERSAND = 101, AMPERSAND_EQUAL = 102,
QUESTION_MARK = 103, ANGLE_BRACKET_LEFT = 104,
ANGLE_BRACKET_LEFT_EQUAL = 105, ANGLE_BRACKET_ANGLE_BRACKET_LEFT = 106,
ANGLE_BRACKET_ANGLE_BRACKET_LEFT_EQUAL = 107, ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE = 108,
ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE_EQUAL = 109, ANGLE_BRACKET_RIGHT = 110,
ANGLE_BRACKET_RIGHT_EQUAL = 111, ANGLE_BRACKET_ANGLE_BRACKET_RIGHT = 112,
ANGLE_BRACKET_ANGLE_BRACKET_RIGHT_EQUAL = 113, TILDE = 114,
STRING_LITERAL = 115, CHAR_LITERAL = 116,
EOF = 117, BUILTIN = 118,
NUMBER_LITERAL = 119, DOC_COMMENT = 120,
CONTAINER_DOC_COMMENT = 121,
}
State = {
START = 1, IDENTIFIER = 2,
BUILTIN = 3, STRING_LITERAL = 5,
STRING_LITERAL_BACKSLASH = 6, MULTILINE_STRING_LITERAL_LINE = 7,
CHAR_LITERAL = 8, CHAR_LITERAL_BACKSLASH = 9,
CHAR_LITERAL_HEX_ESCAPE = 10, CHAR_LITERAL_UNICODE_ESCAPE_SAW_U = 11,
CHAR_LITERAL_UNICODE_ESCAPE = 12, CHAR_LITERAL_UNICODE_INVALID = 13,
CHAR_LITERAL_UNICODE = 14, CHAR_LITERAL_END = 15,
BACKSLASH = 16, EQUAL = 17,
BANG = 18, PIPE = 19,
MINUS = 20, MINUS_PERCENT = 21,
MINUS_PIPE = 22, ASTERISK = 23,
ASTERISK_PERCENT = 24, ASTERISK_PIPE = 25,
SLASH = 26, LINE_COMMENT_START = 27,
LINE_COMMENT = 28, DOC_COMMENT_START = 29,
DOC_COMMENT = 30, INT = 31,
INT_EXPONENT = 32, INT_PERIOD = 33,
FLOAT = 34, FLOAT_EXPONENT = 35,
AMPERSAND = 36, CARET = 37,
PERCENT = 38, PLUS = 39,
PLUS_PERCENT = 40, PLUS_PIPE = 41,
ANGLE_BRACKET_LEFT = 42, ANGLE_BRACKET_ANGLE_BRACKET_LEFT = 43,
ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE = 44, ANGLE_BRACKET_RIGHT = 45,
ANGLE_BRACKET_ANGLE_BRACKET_RIGHT = 46, PERIOD = 47,
PERIOD_2 = 48, PERIOD_ASTERISK = 49,
SAW_AT_SIGN = 50,
}
Lexer = {
Reverse,
Tokens,
State,
x = 0,
}
function Lexer:new()
local l = {}
setmetatable(l, self)
self.__index = self
return l
end
function Lexer:lex(char)
end
return Lexer