diff --git a/grammar.py b/grammar.py index da2fe93..7a4ae75 100644 --- a/grammar.py +++ b/grammar.py @@ -417,10 +417,14 @@ class FineGrammar(Grammar): if __name__ == "__main__": - from parser.parser import compile_lexer, dump_lexer_table + from pathlib import Path + from parser.parser import dump_lexer_table + from parser.tree_sitter import emit_tree_sitter_grammar grammar = FineGrammar() grammar.build_table() - lexer = compile_lexer(grammar) + lexer = grammar.compile_lexer() dump_lexer_table(lexer) + + emit_tree_sitter_grammar(grammar, Path(__file__).parent / "tree-sitter-fine") diff --git a/parser/tree_sitter.py b/parser/tree_sitter.py index d6270d2..87c7757 100644 --- a/parser/tree_sitter.py +++ b/parser/tree_sitter.py @@ -136,7 +136,7 @@ def convert_to_tree_sitter(rule: parser.Rule, grammar: parser.Grammar) -> str: if len(final) > 1: result = f"choice({result})" if has_nothing: - result = f"opt({result})" + result = f"optional({result})" return result elif isinstance(rule, parser.SequenceRule): @@ -162,7 +162,10 @@ def convert_to_tree_sitter(rule: parser.Rule, grammar: parser.Grammar) -> str: return result elif isinstance(rule, parser.NonTerminal): - return f"$['{rule.name}']" + target_name = rule.name + if rule.transparent: + target_name = f"_{target_name}" + return f"$['{target_name}']" elif isinstance(rule, parser.MetadataRule): return convert_to_tree_sitter(rule.rule, grammar)