Compare commits

...
2 Commits
Author SHA1 Message Date
HEL 6524b3591a feat(cli): highlight midas keywords 2026-05-26 10:14:23 +02:00
HEL 170101aa37 fix(parser): add call keywords attribute in gen definition 2026-05-26 10:12:59 +02:00
6 changed files with 32 additions and 19 deletions

No files matched your search

+1
View File
@@ -88,6 +88,7 @@ class UnaryExpr:
class CallExpr: class CallExpr:
callee: Expr callee: Expr
arguments: list[Expr] arguments: list[Expr]
keywords: dict[str, Expr]
class GetExpr: class GetExpr:
+4
View File
@@ -50,4 +50,8 @@ span {
--border: 2px; --border: 2px;
z-index: 10; z-index: 10;
} }
&.keyword {
color: rgb(211, 72, 9);
}
} }
+10 -5
View File
@@ -1,11 +1,12 @@
import ast import ast
from dataclasses import dataclass
from typing import Optional, TextIO from typing import Optional, TextIO
import click import click
from midas.ast.location import Location
import midas.ast.midas as m import midas.ast.midas as m
import midas.ast.python as p import midas.ast.python as p
from midas.ast.location import Location
from midas.ast.printer import PythonAstPrinter from midas.ast.printer import PythonAstPrinter
from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter
from midas.lexer.midas import MidasLexer from midas.lexer.midas import MidasLexer
@@ -73,20 +74,24 @@ def highlight_midas(source: str, path: str) -> Highlighter:
parser = MidasParser(tokens) parser = MidasParser(tokens)
stmts: list[m.Stmt] = parser.parse() stmts: list[m.Stmt] = parser.parse()
highlighter = MidasHighlighter(source) highlighter = MidasHighlighter(source)
for err in parser.errors:
print(err.get_report())
@dataclass(frozen=True)
class LocatableToken: class LocatableToken:
def __init__(self, token: Token): token: Token
self.token: Token = token
@property @property
def location(self) -> Location: def location(self) -> Location:
return self.token.get_location() return self.token.get_location()
for stmt in stmts:
highlighter.highlight(stmt)
for token in tokens: for token in tokens:
if token.type == TokenType.COMMENT: if token.type == TokenType.COMMENT:
highlighter.wrap(LocatableToken(token), "comment") highlighter.wrap(LocatableToken(token), "comment")
for stmt in stmts: elif token.is_keyword:
highlighter.highlight(stmt) highlighter.wrap(LocatableToken(token), "keyword")
return highlighter return highlighter
-12
View File
@@ -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,
}
+1 -2
View File
@@ -1,6 +1,5 @@
from midas.lexer.base import Lexer from midas.lexer.base import Lexer
from midas.lexer.keyword import KEYWORDS from midas.lexer.token import KEYWORDS, TokenType
from midas.lexer.token import TokenType
class MidasLexer(Lexer): class MidasLexer(Lexer):
+16
View File
@@ -58,6 +58,18 @@ class TokenType(Enum):
NEWLINE = auto() 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) @dataclass(frozen=True)
class Token: class Token:
"""A scanned token""" """A scanned token"""
@@ -86,3 +98,7 @@ class Token:
def location_to(self, to: Token) -> Location: def location_to(self, to: Token) -> Location:
return Location.span(self.get_location(), to.get_location()) return Location.span(self.get_location(), to.get_location())
@property
def is_keyword(self) -> bool:
return self.lexeme in KEYWORDS