Hi,
I made a tree-sitter compatible parser genrator: https://github.com/YesDrX/nim-treestand
Examples:
import treestand
import std/os
# Import grammar at compile-time - generates parser directly in your module
importGrammar(currentSourcePath.parentDir / "grammar.js")
when isMainModule:
# Use the auto-generated parser
let tree = parseJson("""{"key": "value", "number": 42}""")
echo tree
2. build your grammar
import treestand
import std/os
# Define grammar using clean DSL syntax
ts_grammar "mathGrammar":
# Entry point - one or more statements
program <- +statement
# Choice between different statement types
statement <- assignment | expression
# Named fields for AST nodes
assignment <- (target: identifier) * eq * (value: expression)
# Precedence and associativity
expression <- number | binary_op | parens
binary_op <- ((left: expression) * op * (right: expression)) ^ 1
parens <- lparen * expression * rparen
# Lexical tokens - use token() wrapper
identifier <- token(re"[a-zA-Z_]\w*")
number <- token(re"\d+")
op <- token(re"[+\-*/]")
eq <- token("=")
lparen <- token("(")
rparen <- token(")")
# Keywords using set syntax
keyword <- {"if", "else", "while"}
# Configuration - skip whitespace
extras = token(re"\s+")
buildGrammar(mathGrammar)