Lua highlighting

This commit is contained in:
liquidex 2024-03-25 22:07:52 +01:00
parent 8f43531b47
commit 97ce063549
4 changed files with 141 additions and 1 deletions

View file

@ -261,7 +261,7 @@
- I don't know if I'll ever optimize this to be even more efficient than it - I don't know if I'll ever optimize this to be even more efficient than it
already is, but source ranges are mostly irrelevant to the high level task of already is, but source ranges are mostly irrelevant to the high level task of
matching tokens, so maybe arranging the storage like matching tokens, so maybe arranging the storage like
```rs ```rust
struct Tokens { struct Tokens {
kinds: Vec<TokenKind>, kinds: Vec<TokenKind>,
source_ranges: Vec<Range<usize>>, source_ranges: Vec<Range<usize>>,

View file

@ -132,3 +132,64 @@
} }
} }
``` ```
- `lua`
- patterns
```lua
-- single-line comment
--[[
multi-line comment
NOTE: comments with [==[ ]==] are not supported due to a lack of backreference support
in Rust regex
]]
'string' "string" [[multiline
string]]
0xABCD 0xA.B 0xAp+3 0xCE.DE5p-2
123 1.0 1.41e-3 1.42E+4 1.43e1
<bye_egg>
...
+ - * / % ^ == ~= <= >= #
funciton() ident
```
- keywords
```lua
if then else elseif end do function repeat until while for break return local in not and or goto
self
true false nil
<close> <const>
```
- sample
```lua
-- Ticks the scheduler: executes every active fiber, removes inactive fibers,
-- and ignores sleeping fibers.
--
-- Extra arguments passed to this function are passed to all running fibers.
function Scheduler:tick(...)
local time = timer.getTime()
local i = 1
while i <= #self.fibers do
local fiber = self.fibers[i]
local coro = fiber.coro
if time >= fiber.wakeAt then
local ok, result = coroutine.resume(coro, ...)
if not ok then
error("scheduler for '"..self.name.."': "..
"ticking '"..fiber.name.."' failed with an error\n"..result)
else
if coroutine.status(coro) == "dead" then
self.fibers[i] = self.fibers[#self.fibers]
self.fibers[#self.fibers] = nil
i = i - 1
elseif result ~= nil and result > 0 then
fiber.wakeAt = time + result
end
end
end
i = i + 1
end
end
```

View file

@ -51,6 +51,11 @@ impl CompiledSyntax {
); );
last_match_end = capture.range().end; last_match_end = capture.range().end;
} }
push_token(
&mut tokens,
types.default,
i + last_match_end..i + whole_match.range().end,
);
i += whole_match.range().end; i += whole_match.range().end;
had_match = true; had_match = true;
break; break;

74
static/syntax/lua.json Normal file
View file

@ -0,0 +1,74 @@
{
"patterns": [
{
"regex": "--\\[\\[.*?\\]\\]",
"flags": ["dotMatchesNewline"],
"is": "comment"
},
{ "regex": "--.*", "is": "comment" },
{ "regex": "'(\\\\'|[^'])*'", "is": "string" },
{ "regex": "\"(\\\\\"|[^\"])*\"", "is": "string" },
{
"regex": "\\[\\[.+?\\]\\]",
"flags": ["dotMatchesNewline"],
"is": "string"
},
{
"regex": "0[xX][0-9a-fA-F]+(\\.[0-9a-fA-F]*)?([pP][-+]?[0-9]+)?",
"is": "literal"
},
{ "regex": "0[xX]\\.[0-9a-fA-F]+([pP][-+]?[0-9]+)?", "is": "literal" },
{ "regex": "[0-9_]+(\\.[0-9_]*([eE][-+]?[0-9_]+)?)?", "is": "literal" },
{
"regex": "<([a-zA-Z_][a-zA-Z0-9_]*)>",
"is": {
"default": "punct",
"captures": ["error error-attribute"]
}
},
{ "regex": "\\.\\.\\.", "is": "punct" },
{ "regex": "[+=/*^%#<>~.-]+", "is": "operator" },
{
"regex": "([a-zA-Z_][a-zA-Z0-9_]*)\\(",
"is": {
"default": "default",
"captures": ["function"]
}
},
{ "regex": "[a-zA-Z_][a-zA-Z0-9_]*", "is": "identifier" }
],
"keywords": {
"if": { "into": "keyword1" },
"then": { "into": "keyword1" },
"else": { "into": "keyword1" },
"elseif": { "into": "keyword1" },
"end": { "into": "keyword1" },
"do": { "into": "keyword1" },
"function": { "into": "keyword1" },
"repeat": { "into": "keyword1" },
"until": { "into": "keyword1" },
"while": { "into": "keyword1" },
"for": { "into": "keyword1" },
"break": { "into": "keyword1" },
"return": { "into": "keyword1" },
"local": { "into": "keyword1" },
"in": { "into": "keyword1" },
"not": { "into": "keyword1" },
"and": { "into": "keyword1" },
"or": { "into": "keyword1" },
"goto": { "into": "keyword1" },
"self": { "into": "keyword2" },
"true": { "into": "literal" },
"false": { "into": "literal" },
"nil": { "into": "literal" },
"close": {
"into": "keyword1",
"onlyReplaces": "error error-attribute"
},
"const": {
"into": "keyword1",
"onlyReplaces": "error error-attribute"
}
}
}