Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion syncode/parsers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import os
from syncode.parsers import incremental_parser
from syncode.parsers.itergen_parser import IGParser
from syncode.parsers.python_parser import PythonIncrementalParser, PythonIndenter
from syncode.parsers.go_parser import GoIncrementalParser
import syncode.common as common
from syncode.larkm.lark import Lark
from syncode.parsers.grammars.grammar import Grammar

def create_parser(grammar: Grammar, parser='lalr', **kwargs) -> incremental_parser.IncrementalParser:
def create_parser(
grammar: Grammar,
parser='lalr',
use_symbol_pos_map=False,
**kwargs
) -> incremental_parser.IncrementalParser:
"""
Creates an incremental parser for the given grammar. The parser is cached for future use.
parser (str, optional): The type of parser to use. Can be 'lalr' or 'lr'. Defaults to 'lalr'.
Expand All @@ -16,6 +22,10 @@ def create_parser(grammar: Grammar, parser='lalr', **kwargs) -> incremental_pars
cache_filename = parser_cache_dir + f'{grammar}_{parser}_{grammar.hash()}_parser.pkl'
os.makedirs(os.path.dirname(parser_cache_dir), exist_ok=True)

# First check if we should use the IGParser with symbol position map
if use_symbol_pos_map:
return IGParser(base_parser, **kwargs)

if grammar.name == 'python':
indenter = PythonIndenter()

Expand All @@ -27,6 +37,7 @@ def create_parser(grammar: Grammar, parser='lalr', **kwargs) -> incremental_pars
return GoIncrementalParser(base_parser, **kwargs)
return incremental_parser.IncrementalParser(base_parser, **kwargs)


def create_base_parser(grammar, parser='lalr', indenter=None, cache_filename=None):
base_parser = Lark( # This is the standard Lark parser
grammar.ebnf,
Expand Down
Loading