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 { Pos, Token } from "./token.ts";
export class Lexer {
private index = 0;
private line = 1;
@ -77,12 +76,11 @@ export class Lexer {
if (this.done()) {
break;
}
value +=
{
n: "\n",
t: "\t",
"0": "\0",
}[this.current()] ?? this.current();
value += {
n: "\n",
t: "\t",
"0": "\0",
}[this.current()] ?? this.current();
} else {
value += this.current();
}
@ -132,6 +130,16 @@ export class Lexer {
this.step();
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);
}
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 Number '0'
syn match Number '[1-9][0-9]*'

View File

@ -1,84 +1,84 @@
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "Slige",
"patterns": [
{ "include": "#keywords" },
{ "include": "#strings" },
{ "include": "#numbers" },
{ "include": "#operators" },
{ "include": "#punctuation" },
{ "include": "#functions" },
{ "include": "#idents" }
],
"repository": {
"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": {
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "Slige",
"patterns": [
{ "include": "#keywords" },
{ "include": "#strings" },
{ "include": "#numbers" },
{ "include": "#operators" },
{ "include": "#punctuation" },
{ "include": "#functions" },
{ "include": "#idents" }
],
"repository": {
"keywords": {
"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"
}
]
},
"punctuation": {
"patterns": [
{
"match": ";",
"name": "punctuation.terminator.statement.slige"
},
{
"match": ",",
"name": "punctuation.separator.delimiter.slige"
}
]
},
"functions": {
"punctuation": {
"patterns": [
{
"match": ";",
"name": "punctuation.terminator.statement.slige"
},
{
"match": ",",
"name": "punctuation.separator.delimiter.slige"
}
]
},
"functions": {
"patterns": [
{
"match": "(?>\\b[a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=(?>\\:\\:<.*?>)?\\()",
@ -86,14 +86,18 @@
}
]
},
"idents": {
"idents": {
"patterns": [
{
"match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b",
"match": "\\b[a-z_][a-zA-Z0-9_]*\\b",
"name": "variable.other.slige"
},
{
"match": "\\b[A-Z][a-zA-Z0-9_]*\\b",
"name": "entity.name.type.slige"
}
]
}
},
"scopeName": "source.slige"
}
},
"scopeName": "source.slige"
}