From 6524b3591a631a9f551cb0604dbec6a72634a616 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Tue, 26 May 2026 10:14:23 +0200 Subject: [PATCH] feat(cli): highlight midas keywords --- midas/cli/highlight.css | 4 ++++ midas/cli/main.py | 15 ++++++++++----- midas/lexer/keyword.py | 12 ------------ midas/lexer/midas.py | 3 +-- midas/lexer/token.py | 16 ++++++++++++++++ 5 files changed, 31 insertions(+), 19 deletions(-) delete mode 100644 midas/lexer/keyword.py diff --git a/midas/cli/highlight.css b/midas/cli/highlight.css index 1abed08..31f005d 100644 --- a/midas/cli/highlight.css +++ b/midas/cli/highlight.css @@ -50,4 +50,8 @@ span { --border: 2px; z-index: 10; } + + &.keyword { + color: rgb(211, 72, 9); + } } \ No newline at end of file diff --git a/midas/cli/main.py b/midas/cli/main.py index fb0e716..11d69e0 100644 --- a/midas/cli/main.py +++ b/midas/cli/main.py @@ -1,11 +1,12 @@ import ast +from dataclasses import dataclass from typing import Optional, TextIO import click -from midas.ast.location import Location import midas.ast.midas as m import midas.ast.python as p +from midas.ast.location import Location from midas.ast.printer import PythonAstPrinter from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter from midas.lexer.midas import MidasLexer @@ -73,20 +74,24 @@ def highlight_midas(source: str, path: str) -> Highlighter: parser = MidasParser(tokens) stmts: list[m.Stmt] = parser.parse() highlighter = MidasHighlighter(source) + for err in parser.errors: + print(err.get_report()) + @dataclass(frozen=True) class LocatableToken: - def __init__(self, token: Token): - self.token: Token = token + token: Token @property def location(self) -> Location: return self.token.get_location() + for stmt in stmts: + highlighter.highlight(stmt) for token in tokens: if token.type == TokenType.COMMENT: highlighter.wrap(LocatableToken(token), "comment") - for stmt in stmts: - highlighter.highlight(stmt) + elif token.is_keyword: + highlighter.wrap(LocatableToken(token), "keyword") return highlighter diff --git a/midas/lexer/keyword.py b/midas/lexer/keyword.py deleted file mode 100644 index 878f8cd..0000000 --- a/midas/lexer/keyword.py +++ /dev/null @@ -1,12 +0,0 @@ -from midas.lexer.token import TokenType - -KEYWORDS: dict[str, TokenType] = { - "type": TokenType.TYPE, - "op": TokenType.OP, - "predicate": TokenType.PREDICATE, - "extend": TokenType.EXTEND, - "where": TokenType.WHERE, - "true": TokenType.TRUE, - "false": TokenType.FALSE, - "none": TokenType.NONE, -} diff --git a/midas/lexer/midas.py b/midas/lexer/midas.py index fe521ce..acc97d6 100644 --- a/midas/lexer/midas.py +++ b/midas/lexer/midas.py @@ -1,6 +1,5 @@ from midas.lexer.base import Lexer -from midas.lexer.keyword import KEYWORDS -from midas.lexer.token import TokenType +from midas.lexer.token import KEYWORDS, TokenType class MidasLexer(Lexer): diff --git a/midas/lexer/token.py b/midas/lexer/token.py index 052d8a6..a518a8b 100644 --- a/midas/lexer/token.py +++ b/midas/lexer/token.py @@ -58,6 +58,18 @@ class TokenType(Enum): NEWLINE = auto() +KEYWORDS: dict[str, TokenType] = { + "type": TokenType.TYPE, + "op": TokenType.OP, + "predicate": TokenType.PREDICATE, + "extend": TokenType.EXTEND, + "where": TokenType.WHERE, + "true": TokenType.TRUE, + "false": TokenType.FALSE, + "none": TokenType.NONE, +} + + @dataclass(frozen=True) class Token: """A scanned token""" @@ -86,3 +98,7 @@ class Token: def location_to(self, to: Token) -> Location: return Location.span(self.get_location(), to.get_location()) + + @property + def is_keyword(self) -> bool: + return self.lexeme in KEYWORDS