This commit is contained in:
SimonFJ20 2024-12-13 10:14:36 +01:00
parent 8c172ccbe4
commit da1dbb92cd
3 changed files with 100 additions and 86 deletions

View File

@ -1,7 +1,6 @@
import { Reporter } from "./info.ts"; import { Reporter } from "./info.ts";
import { Pos, Token } from "./token.ts"; import { Pos, Token } from "./token.ts";
export class Lexer { export class Lexer {
private index = 0; private index = 0;
private line = 1; private line = 1;
@ -77,12 +76,11 @@ export class Lexer {
if (this.done()) { if (this.done()) {
break; break;
} }
value += value += {
{ n: "\n",
n: "\n", t: "\t",
t: "\t", "0": "\0",
"0": "\0", }[this.current()] ?? this.current();
}[this.current()] ?? this.current();
} else { } else {
value += this.current(); value += this.current();
} }
@ -132,6 +130,16 @@ export class Lexer {
this.step(); this.step();
return this.token("->", pos); return this.token("->", pos);
} }
if (first === ":") {
if (!this.done() && this.test(":")) {
this.step();
if (!this.done() && this.test("<")) {
this.step();
return this.token("::<", pos);
}
return this.token("::", pos);
}
}
return this.token(first, pos); return this.token(first, pos);
} }
if (this.test("/")) { if (this.test("/")) {

View File

@ -26,6 +26,8 @@ syn match Operator '>='
syn match Operator '\.' syn match Operator '\.'
syn match Operator ':' syn match Operator ':'
syn match Operator '->' syn match Operator '->'
syn match Operator '::'
syn match Operator '::<'
syn match Number '0' syn match Number '0'
syn match Number '[1-9][0-9]*' syn match Number '[1-9][0-9]*'

View File

@ -1,84 +1,84 @@
{ {
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "Slige", "name": "Slige",
"patterns": [ "patterns": [
{ "include": "#keywords" }, { "include": "#keywords" },
{ "include": "#strings" }, { "include": "#strings" },
{ "include": "#numbers" }, { "include": "#numbers" },
{ "include": "#operators" }, { "include": "#operators" },
{ "include": "#punctuation" }, { "include": "#punctuation" },
{ "include": "#functions" }, { "include": "#functions" },
{ "include": "#idents" } { "include": "#idents" }
], ],
"repository": { "repository": {
"keywords": { "keywords": {
"patterns": [
{
"name": "keyword.control.slige",
"match": "\\b(break|return|let|fn|loop|if|else|struct|import|or|and|not)\\b"
},
{
"name": "constant.language.slige",
"match": "\\b(null|false|true)\\b"
},
{
"name": "storage.type.slige",
"match": "\\b(int|string|bool)\\b"
}
]
},
"strings": {
"name": "string.quoted.double.slige",
"begin": "\"",
"end": "\"",
"patterns": [
{
"name": "constant.character.escape.slige",
"match": "\\\\."
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.slige",
"match": "\\b0\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b[1-9][0-9]*(\\.[0-9]+)?\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b0x[0-9a-fA-F]+?\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b0b[01]+?\\b"
}
]
},
"operators": {
"patterns": [ "patterns": [
{ {
"match": "\\+|\\-|\\*|\\/|=|(==)|(!=)|<|>|(<=)|(>=)|\\.|:|(\\->)", "name": "keyword.control.slige",
"match": "\\b(break|return|let|fn|loop|if|else|struct|import|or|and|not)\\b"
},
{
"name": "constant.language.slige",
"match": "\\b(null|false|true)\\b"
},
{
"name": "storage.type.slige",
"match": "\\b(int|string|bool)\\b"
}
]
},
"strings": {
"name": "string.quoted.double.slige",
"begin": "\"",
"end": "\"",
"patterns": [
{
"name": "constant.character.escape.slige",
"match": "\\\\."
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.slige",
"match": "\\b0\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b[1-9][0-9]*(\\.[0-9]+)?\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b0x[0-9a-fA-F]+?\\b"
},
{
"name": "constant.numeric.slige",
"match": "\\b0b[01]+?\\b"
}
]
},
"operators": {
"patterns": [
{
"match": "\\+|\\-|\\*|\\/|=|(==)|(!=)|<|>|(<=)|(>=)|\\.|:|(\\->)|(::)|(::<)",
"name": "keyword.operator.slige" "name": "keyword.operator.slige"
} }
] ]
}, },
"punctuation": { "punctuation": {
"patterns": [ "patterns": [
{ {
"match": ";", "match": ";",
"name": "punctuation.terminator.statement.slige" "name": "punctuation.terminator.statement.slige"
}, },
{ {
"match": ",", "match": ",",
"name": "punctuation.separator.delimiter.slige" "name": "punctuation.separator.delimiter.slige"
} }
] ]
}, },
"functions": { "functions": {
"patterns": [ "patterns": [
{ {
"match": "(?>\\b[a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=(?>\\:\\:<.*?>)?\\()", "match": "(?>\\b[a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=(?>\\:\\:<.*?>)?\\()",
@ -86,14 +86,18 @@
} }
] ]
}, },
"idents": { "idents": {
"patterns": [ "patterns": [
{ {
"match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b", "match": "\\b[a-z_][a-zA-Z0-9_]*\\b",
"name": "variable.other.slige" "name": "variable.other.slige"
},
{
"match": "\\b[A-Z][a-zA-Z0-9_]*\\b",
"name": "entity.name.type.slige"
} }
] ]
} }
}, },
"scopeName": "source.slige" "scopeName": "source.slige"
} }