diff --git a/server/src/parser/parser.py b/server/src/parser/parser.py new file mode 100644 index 0000000..366230d --- /dev/null +++ b/server/src/parser/parser.py @@ -0,0 +1,32 @@ +from lark import Lark, Transformer, Token, v_args +from pathlib import Path + +GRAMMAR_FILE = Path(__file__).parent.joinpath("tcl.lark") +TCL_GRAMMAR = GRAMMAR_FILE.read_text(encoding="utf-8") + + +@v_args(inline=True) +class TCLTransformer(Transformer): + def start(self, *stmts): + return list(stmts) + + def command(self, *elements): + return list(elements) + + def braced(self, *content): + return "{" + "".join(c for c in content) + "}" + + def quoted(self, *content): + return '"' + "".join(c for c in content) + '"' + + def variable(self, token): + return token.value + + def cmdsubst(self, *inner): + return "[" + " ".join(inner) + "]" + + def bare(self, token): + return token.value + + def COMMENT(self, token): + return token.value diff --git a/server/src/parser/tcl.lark b/server/src/parser/tcl.lark new file mode 100644 index 0000000..b8a7353 --- /dev/null +++ b/server/src/parser/tcl.lark @@ -0,0 +1,27 @@ +start: statement* + +?statement: command | COMMENT + +COMMENT: /#[^\n]*/ + +command: element+ + +?element: braced +| quoted +| variable +| cmdsubst +| bare + +braced: "{" inner_braced* "}" +inner_braced: /[^{}]+/ | braced + +quoted: '"' inner_quoted* '"' +inner_quoted: /[^"{}]+/ | braced + +variable: "$" /[A-Za-z_][A-Za-z0-9_]*/ +cmdsubst: "[" start "]" + +bare: /[^\s{}$"]+/ + +%import common.WS_INLINE +%ignore WS_INLINE \ No newline at end of file