triple backquotes & type charset

This commit is contained in:
Michael Sippel 2025-06-13 10:30:11 +02:00
parent 21646a9209
commit 34f5ccafb3
Signed by: senvas
GPG key ID: F96CF119C34B64A6
6 changed files with 114 additions and 150 deletions

View file

@ -14,14 +14,14 @@ module.exports = grammar({
source_file: ($) => $.morphbase,
morphbase: ($) => seq($.include, repeat($.stmnt)),
include: ($) => seq("(", $.ident, ")"),
include: ($) => seq("```", /(.*)/, "```"),
stmnt: ($) => choice($.comment, $.def),
comment: (_) => seq("/*", /(.*)/, "*/"),
def: ($) => choice($.typedef, $.morphdef),
typedef: ($) => seq("type", $.ident, "=", $.type, ";"),
morphdef: ($) => seq("morph", $.ident, ":", $.type, "=", $.impl, ";"),
ident: ($) => /([a-zA-Z$][0-9a-zA-Z_\-]*)/,
type: ($) => /([a-zA-Z$][0-9a-zA-Z_\-\.]*)/,
impl: ($) => seq("'", /(.)/, "'"),
type: ($) => /([^=]*)/,
impl: ($) => seq("```", /([^\`])/, "```"),
},
});

View file

@ -1,4 +1,4 @@
"type" @keyword
"morph" @keyword
(type) @type
(include) @string
(ident) @identifier
(def) @keyword
(impl) @string

16
src/grammar.json generated
View file

@ -27,15 +27,15 @@
"members": [
{
"type": "STRING",
"value": "("
"value": "```"
},
{
"type": "SYMBOL",
"name": "ident"
"type": "PATTERN",
"value": "(.*)"
},
{
"type": "STRING",
"value": ")"
"value": "```"
}
]
},
@ -146,22 +146,22 @@
},
"type": {
"type": "PATTERN",
"value": "([a-zA-Z$][0-9a-zA-Z_\\-\\.]*)"
"value": "([^=]*)"
},
"impl": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "'"
"value": "```"
},
{
"type": "PATTERN",
"value": "(.)"
"value": "([^\\`])"
},
{
"type": "STRING",
"value": "'"
"value": "```"
}
]
}

28
src/node-types.json generated
View file

@ -31,17 +31,7 @@
{
"type": "include",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "ident",
"named": true
}
]
}
"fields": {}
},
{
"type": "morphbase",
@ -139,18 +129,6 @@
]
}
},
{
"type": "'",
"named": false
},
{
"type": "(",
"named": false
},
{
"type": ")",
"named": false
},
{
"type": "*/",
"named": false
@ -171,6 +149,10 @@
"type": "=",
"named": false
},
{
"type": "```",
"named": false
},
{
"type": "ident",
"named": true

195
src/parser.c generated
View file

@ -9,9 +9,9 @@
#define LANGUAGE_VERSION 15
#define STATE_COUNT 30
#define LARGE_STATE_COUNT 2
#define SYMBOL_COUNT 25
#define SYMBOL_COUNT 23
#define ALIAS_COUNT 0
#define TOKEN_COUNT 15
#define TOKEN_COUNT 13
#define EXTERNAL_TOKEN_COUNT 0
#define FIELD_COUNT 0
#define MAX_ALIAS_SEQUENCE_LENGTH 7
@ -20,38 +20,35 @@
#define SUPERTYPE_COUNT 0
enum ts_symbol_identifiers {
anon_sym_LPAREN = 1,
anon_sym_RPAREN = 2,
anon_sym_BQUOTE_BQUOTE_BQUOTE = 1,
aux_sym_include_token1 = 2,
anon_sym_SLASH_STAR = 3,
aux_sym_comment_token1 = 4,
anon_sym_STAR_SLASH = 5,
anon_sym_type = 6,
anon_sym_EQ = 7,
anon_sym_SEMI = 8,
anon_sym_morph = 9,
anon_sym_COLON = 10,
sym_ident = 11,
sym_type = 12,
anon_sym_SQUOTE = 13,
aux_sym_impl_token1 = 14,
sym_source_file = 15,
sym_morphbase = 16,
sym_include = 17,
sym_stmnt = 18,
sym_comment = 19,
sym_def = 20,
sym_typedef = 21,
sym_morphdef = 22,
sym_impl = 23,
aux_sym_morphbase_repeat1 = 24,
anon_sym_STAR_SLASH = 4,
anon_sym_type = 5,
anon_sym_EQ = 6,
anon_sym_SEMI = 7,
anon_sym_morph = 8,
anon_sym_COLON = 9,
sym_ident = 10,
sym_type = 11,
aux_sym_impl_token1 = 12,
sym_source_file = 13,
sym_morphbase = 14,
sym_include = 15,
sym_stmnt = 16,
sym_comment = 17,
sym_def = 18,
sym_typedef = 19,
sym_morphdef = 20,
sym_impl = 21,
aux_sym_morphbase_repeat1 = 22,
};
static const char * const ts_symbol_names[] = {
[ts_builtin_sym_end] = "end",
[anon_sym_LPAREN] = "(",
[anon_sym_RPAREN] = ")",
[anon_sym_BQUOTE_BQUOTE_BQUOTE] = "```",
[aux_sym_include_token1] = "include_token1",
[anon_sym_SLASH_STAR] = "/*",
[aux_sym_comment_token1] = "comment_token1",
[anon_sym_STAR_SLASH] = "*/",
[anon_sym_type] = "type",
[anon_sym_EQ] = "=",
@ -60,7 +57,6 @@ static const char * const ts_symbol_names[] = {
[anon_sym_COLON] = ":",
[sym_ident] = "ident",
[sym_type] = "type",
[anon_sym_SQUOTE] = "'",
[aux_sym_impl_token1] = "impl_token1",
[sym_source_file] = "source_file",
[sym_morphbase] = "morphbase",
@ -76,10 +72,9 @@ static const char * const ts_symbol_names[] = {
static const TSSymbol ts_symbol_map[] = {
[ts_builtin_sym_end] = ts_builtin_sym_end,
[anon_sym_LPAREN] = anon_sym_LPAREN,
[anon_sym_RPAREN] = anon_sym_RPAREN,
[anon_sym_BQUOTE_BQUOTE_BQUOTE] = anon_sym_BQUOTE_BQUOTE_BQUOTE,
[aux_sym_include_token1] = aux_sym_include_token1,
[anon_sym_SLASH_STAR] = anon_sym_SLASH_STAR,
[aux_sym_comment_token1] = aux_sym_comment_token1,
[anon_sym_STAR_SLASH] = anon_sym_STAR_SLASH,
[anon_sym_type] = anon_sym_type,
[anon_sym_EQ] = anon_sym_EQ,
@ -88,7 +83,6 @@ static const TSSymbol ts_symbol_map[] = {
[anon_sym_COLON] = anon_sym_COLON,
[sym_ident] = sym_ident,
[sym_type] = sym_type,
[anon_sym_SQUOTE] = anon_sym_SQUOTE,
[aux_sym_impl_token1] = aux_sym_impl_token1,
[sym_source_file] = sym_source_file,
[sym_morphbase] = sym_morphbase,
@ -107,22 +101,18 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
.visible = false,
.named = true,
},
[anon_sym_LPAREN] = {
[anon_sym_BQUOTE_BQUOTE_BQUOTE] = {
.visible = true,
.named = false,
},
[anon_sym_RPAREN] = {
.visible = true,
[aux_sym_include_token1] = {
.visible = false,
.named = false,
},
[anon_sym_SLASH_STAR] = {
.visible = true,
.named = false,
},
[aux_sym_comment_token1] = {
.visible = false,
.named = false,
},
[anon_sym_STAR_SLASH] = {
.visible = true,
.named = false,
@ -155,10 +145,6 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
.visible = true,
.named = true,
},
[anon_sym_SQUOTE] = {
.visible = true,
.named = false,
},
[aux_sym_impl_token1] = {
.visible = false,
.named = false,
@ -251,93 +237,87 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
eof = lexer->eof(lexer);
switch (state) {
case 0:
if (eof) ADVANCE(13);
if (eof) ADVANCE(14);
ADVANCE_MAP(
'\'', 27,
'(', 14,
')', 15,
'*', 3,
'/', 2,
'*', 2,
'/', 1,
':', 24,
';', 22,
'=', 21,
'm', 6,
't', 10,
'`', 4,
'm', 7,
't', 11,
);
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') SKIP(0);
END_STATE();
case 1:
if (lookahead == '\n') SKIP(1);
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') ADVANCE(29);
if (lookahead != 0) ADVANCE(28);
if (lookahead == '*') ADVANCE(18);
END_STATE();
case 2:
if (lookahead == '*') ADVANCE(16);
END_STATE();
case 3:
if (lookahead == '/') ADVANCE(19);
END_STATE();
case 3:
if (lookahead == '`') ADVANCE(15);
END_STATE();
case 4:
if (lookahead == 'e') ADVANCE(20);
if (lookahead == '`') ADVANCE(3);
END_STATE();
case 5:
if (lookahead == 'h') ADVANCE(23);
if (lookahead == 'e') ADVANCE(20);
END_STATE();
case 6:
if (lookahead == 'o') ADVANCE(9);
if (lookahead == 'h') ADVANCE(23);
END_STATE();
case 7:
if (lookahead == 'p') ADVANCE(4);
if (lookahead == 'o') ADVANCE(10);
END_STATE();
case 8:
if (lookahead == 'p') ADVANCE(5);
END_STATE();
case 9:
if (lookahead == 'r') ADVANCE(8);
if (lookahead == 'p') ADVANCE(6);
END_STATE();
case 10:
if (lookahead == 'y') ADVANCE(7);
if (lookahead == 'r') ADVANCE(9);
END_STATE();
case 11:
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') SKIP(11);
if (lookahead == '$' ||
('A' <= lookahead && lookahead <= 'Z') ||
('a' <= lookahead && lookahead <= 'z')) ADVANCE(25);
if (lookahead == 'y') ADVANCE(8);
END_STATE();
case 12:
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') SKIP(12);
if (lookahead == '$' ||
('A' <= lookahead && lookahead <= 'Z') ||
('a' <= lookahead && lookahead <= 'z')) ADVANCE(26);
('a' <= lookahead && lookahead <= 'z')) ADVANCE(25);
END_STATE();
case 13:
ACCEPT_TOKEN(ts_builtin_sym_end);
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') ADVANCE(29);
if (lookahead != 0 &&
lookahead != '`') ADVANCE(28);
END_STATE();
case 14:
ACCEPT_TOKEN(anon_sym_LPAREN);
ACCEPT_TOKEN(ts_builtin_sym_end);
END_STATE();
case 15:
ACCEPT_TOKEN(anon_sym_RPAREN);
ACCEPT_TOKEN(anon_sym_BQUOTE_BQUOTE_BQUOTE);
END_STATE();
case 16:
ACCEPT_TOKEN(anon_sym_SLASH_STAR);
END_STATE();
case 17:
ACCEPT_TOKEN(aux_sym_comment_token1);
ACCEPT_TOKEN(aux_sym_include_token1);
if (lookahead == '\t' ||
(0x0b <= lookahead && lookahead <= '\r') ||
lookahead == ' ') ADVANCE(17);
lookahead == ' ') ADVANCE(16);
if (lookahead != 0 &&
(lookahead < '\t' || '\r' < lookahead)) ADVANCE(18);
(lookahead < '\t' || '\r' < lookahead)) ADVANCE(17);
END_STATE();
case 17:
ACCEPT_TOKEN(aux_sym_include_token1);
if (lookahead != 0 &&
lookahead != '\n') ADVANCE(17);
END_STATE();
case 18:
ACCEPT_TOKEN(aux_sym_comment_token1);
if (lookahead != 0 &&
lookahead != '\n') ADVANCE(18);
ACCEPT_TOKEN(anon_sym_SLASH_STAR);
END_STATE();
case 19:
ACCEPT_TOKEN(anon_sym_STAR_SLASH);
@ -367,26 +347,25 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
END_STATE();
case 26:
ACCEPT_TOKEN(sym_type);
if (lookahead == '-' ||
lookahead == '.' ||
('0' <= lookahead && lookahead <= '9') ||
('A' <= lookahead && lookahead <= 'Z') ||
lookahead == '_' ||
('a' <= lookahead && lookahead <= 'z')) ADVANCE(26);
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') ADVANCE(26);
if (lookahead != 0 &&
lookahead != '=') ADVANCE(27);
END_STATE();
case 27:
ACCEPT_TOKEN(anon_sym_SQUOTE);
ACCEPT_TOKEN(sym_type);
if (lookahead != 0 &&
lookahead != '=') ADVANCE(27);
END_STATE();
case 28:
ACCEPT_TOKEN(aux_sym_impl_token1);
END_STATE();
case 29:
ACCEPT_TOKEN(aux_sym_impl_token1);
if (lookahead == '\t' ||
(0x0b <= lookahead && lookahead <= '\r') ||
if (('\t' <= lookahead && lookahead <= '\r') ||
lookahead == ' ') ADVANCE(29);
if (lookahead != 0 &&
(lookahead < '\t' || '\r' < lookahead)) ADVANCE(28);
lookahead != '`') ADVANCE(28);
END_STATE();
default:
return false;
@ -407,20 +386,20 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = {
[10] = {.lex_state = 0},
[11] = {.lex_state = 0},
[12] = {.lex_state = 0},
[13] = {.lex_state = 11},
[13] = {.lex_state = 16},
[14] = {.lex_state = 0},
[15] = {.lex_state = 11},
[16] = {.lex_state = 11},
[17] = {.lex_state = 17},
[15] = {.lex_state = 12},
[16] = {.lex_state = 12},
[17] = {.lex_state = 16},
[18] = {.lex_state = 0},
[19] = {.lex_state = 0},
[20] = {.lex_state = 0},
[21] = {.lex_state = 12},
[21] = {.lex_state = 26},
[22] = {.lex_state = 0},
[23] = {.lex_state = 12},
[23] = {.lex_state = 26},
[24] = {.lex_state = 0},
[25] = {.lex_state = 0},
[26] = {.lex_state = 1},
[26] = {.lex_state = 13},
[27] = {.lex_state = 0},
[28] = {.lex_state = 0},
[29] = {.lex_state = 0},
@ -429,8 +408,7 @@ static const TSLexerMode ts_lex_modes[STATE_COUNT] = {
static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = {
[STATE(0)] = {
[ts_builtin_sym_end] = ACTIONS(1),
[anon_sym_LPAREN] = ACTIONS(1),
[anon_sym_RPAREN] = ACTIONS(1),
[anon_sym_BQUOTE_BQUOTE_BQUOTE] = ACTIONS(1),
[anon_sym_SLASH_STAR] = ACTIONS(1),
[anon_sym_STAR_SLASH] = ACTIONS(1),
[anon_sym_type] = ACTIONS(1),
@ -438,13 +416,12 @@ static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = {
[anon_sym_SEMI] = ACTIONS(1),
[anon_sym_morph] = ACTIONS(1),
[anon_sym_COLON] = ACTIONS(1),
[anon_sym_SQUOTE] = ACTIONS(1),
},
[STATE(1)] = {
[sym_source_file] = STATE(14),
[sym_morphbase] = STATE(18),
[sym_include] = STATE(2),
[anon_sym_LPAREN] = ACTIONS(3),
[anon_sym_BQUOTE_BQUOTE_BQUOTE] = ACTIONS(3),
},
};
@ -541,15 +518,15 @@ static const uint16_t ts_small_parse_table[] = {
anon_sym_morph,
[117] = 2,
ACTIONS(38), 1,
anon_sym_SQUOTE,
anon_sym_BQUOTE_BQUOTE_BQUOTE,
STATE(27), 1,
sym_impl,
[124] = 1,
ACTIONS(40), 1,
anon_sym_RPAREN,
anon_sym_BQUOTE_BQUOTE_BQUOTE,
[128] = 1,
ACTIONS(42), 1,
sym_ident,
aux_sym_include_token1,
[132] = 1,
ACTIONS(44), 1,
ts_builtin_sym_end,
@ -561,7 +538,7 @@ static const uint16_t ts_small_parse_table[] = {
sym_ident,
[144] = 1,
ACTIONS(50), 1,
aux_sym_comment_token1,
aux_sym_include_token1,
[148] = 1,
ACTIONS(52), 1,
ts_builtin_sym_end,
@ -594,7 +571,7 @@ static const uint16_t ts_small_parse_table[] = {
anon_sym_SEMI,
[188] = 1,
ACTIONS(72), 1,
anon_sym_SQUOTE,
anon_sym_BQUOTE_BQUOTE_BQUOTE,
[192] = 1,
ACTIONS(74), 1,
anon_sym_SEMI,

View file

@ -1,5 +1,10 @@
(stdio)
type PosInt : ∀(Radix:).∀(Endianness:Type);
morph name : ty = 'l';
```
#include <stdio.h>
```
/* das ist ein test */
/* type PosInt (Radix:) = <PosInt Radix BigEndian> ~ [ <Digit Radix> ]; */
/* das ist ein test */
morph name : ty = ```
// hello
```;