Associate metadata with terminals

This is a half-assed attempt at doing syntax coloring which I think
will almost certainly turn out to be insufficient. I'm committing it
just to record some of the work I've done but. BUT.

Probably trying to match tree-sitter is a better way of doing
this. (But, like, emitting tree-sitter grammars? Really? Wow, dude.
Way to give up.)
This commit is contained in:
John Doty 2024-08-27 15:43:07 -07:00
parent 76ef85483e
commit 49ad7fdb52
2 changed files with 149 additions and 60 deletions

View file

@ -1609,10 +1609,14 @@ class Terminal(Rule):
value: str | None
pattern: "str | Re"
meta: dict[str, typing.Any]
regex: bool
def __init__(self, pattern, *, name=None):
def __init__(self, pattern: "str|Re", *, name: str | None = None, **kwargs):
self.value = name
self.pattern = pattern
self.meta = kwargs
self.regex = isinstance(pattern, Re)
def flatten(self) -> typing.Generator[list["str | Terminal"], None, None]:
# We are just ourselves when flattened.
@ -2537,3 +2541,91 @@ def dump_lexer_table(table: LexerTable, name: str = "lexer.dot"):
pass
f.write("}\n")
# NOTE: We have rich metadata system man, wow, how cool are we?
#
# The whole point of this stuff here is to allow automatic
# generation/maintenance of syntax coloring for editors. And maybe some
# other stuff? This is *extremely provisional*, I'm not even sure it
# makes sense yet. Tree sitter works differently, for example, and it's
# not clear at all what we want to generate for any particular editor.
#
# This here might be enough to produce extremely basic TextMate
# grammars but anything more complicated will want tree patterns
# anyway, and we can only do tree patterns by influencing the grammar.
class TerminalMeta:
pass
class TerminalKind(TerminalMeta):
class Comment(TerminalMeta):
class Block(TerminalMeta):
pass
class Line(TerminalMeta):
pass
class Constant(TerminalMeta):
class Language(TerminalMeta):
pass
class Numeric(TerminalMeta):
pass
class Keyword(TerminalMeta):
class Control(TerminalMeta):
class Conditional(TerminalMeta):
pass
class Operator(TerminalMeta):
class Expression(TerminalMeta):
pass
class Other(TerminalMeta):
pass
class Punctuation(TerminalMeta):
class Separator(TerminalMeta):
pass
class Parenthesis(TerminalMeta):
class Open(TerminalMeta):
pass
class Close(TerminalMeta):
pass
class CurlyBrace(TerminalMeta):
class Open(TerminalMeta):
pass
class Close(TerminalMeta):
pass
class SquareBracket(TerminalMeta):
class Open(TerminalMeta):
pass
class Close(TerminalMeta):
pass
class Storage(TerminalMeta):
class Type(TerminalMeta):
class Class(TerminalMeta):
pass
class Function(TerminalMeta):
pass
class String(TerminalMeta):
class Quoted(TerminalMeta):
class Single(TerminalMeta):
pass
class Double(TerminalMeta):
pass
class Variable(TerminalMeta):
class Language(TerminalMeta):
pass