Coverage for src/pyensae/languages/antlr_grammar_use.py: 35%
63 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-03 02:16 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-03 02:16 +0200
1"""
2@file
3@brief Use grammar
4This module requires `antlr4-python3-runtime <https://pypi.python.org/pypi/antlr4-python3-runtime/>`_.
5"""
6import os
7from antlr4 import ParseTreeWalker, CommonTokenStream, InputStream
8from .tree_string_listener import TreeStringListener
9from .tree_graph_listener import TreeGraphListener
12def get_parser_lexer(language):
13 """
14 Returns two classes, a parser and a lexer from :epkg:`antlr4`.
16 @param language to analyse
17 @return Parser, Lexer
18 """
19 try:
20 if language == "C#" or language == "CSharp":
21 language = "CSharp4"
23 if language == "R":
24 from .RLexer import RLexer
25 from .RParser import RParser
26 return RParser, RLexer
27 elif language == "CSharp4":
28 from .CSharpLexer import CSharpLexer
29 from .CSharpParser import CSharpParser
30 return CSharpParser, CSharpLexer
31 elif language == "SQLite":
32 from .SQLiteLexer import SQLiteLexer
33 from .SQLiteParser import SQLiteParser
34 return SQLiteParser, SQLiteLexer
35 elif language == "DOT":
36 from .DOTLexer import DOTLexer
37 from .DOTParser import DOTParser
38 return DOTParser, DOTLexer
39 elif language == "Python3":
40 from .Python3Lexer import Python3Lexer
41 from .Python3Parser import Python3Parser
42 return Python3Parser, Python3Lexer
43 elif language == "SimpleWorkflow":
44 from .SimpleWorkflowLexer import SimpleWorkflowLexer
45 from .SimpleWorkflowParser import SimpleWorkflowParser
46 return SimpleWorkflowParser, SimpleWorkflowLexer
47 else:
48 folder = os.path.dirname(__file__)
49 if folder == "":
50 folder = "."
51 files = os.listdir(folder)
52 raise ImportError(
53 "unable to import parsers for language: " +
54 language +
55 "\navailable files:\n{0}".format(
56 "\n".join(files)))
57 except ImportError as e:
58 folder = os.path.dirname(__file__)
59 if folder == "":
60 folder = "."
61 files = os.listdir(folder)
62 raise ImportError(
63 "unable to import parsers for language: " +
64 language +
65 "\navailable files:\n{0}".format(
66 "\n".join(files))) from e
69def parse_code(code, class_parser, class_lexer):
70 """
71 Parses a code and returns a tree.
73 @param code code to parse
74 @param class_parser parser
75 @param class_lexer lexer
76 @return parsed code
77 """
78 if isinstance(code, str):
79 # we assume it is a string
80 code = InputStream(code)
82 lexer = class_lexer(code)
83 stream = CommonTokenStream(lexer)
84 parser = class_parser(stream)
85 return parser
88def get_tree_string(tree, parser, format=TreeStringListener):
89 """
90 Returns a string which shows the parsed tree.
92 @param tree from @see fn parse_code
93 @param parser the parser used to build the tree, output of @see fn parse_code
94 @param format None or a class `ParseTreeListener <https://github.com/antlr/antlr4-python3/blob/master/src/antlr4/tree/Tree.py>`_
95 @return string
96 """
97 if format is None:
98 return tree.toStringTree()
99 else:
100 walker = ParseTreeWalker()
101 listen = format(parser)
102 walker.walk(listen, tree)
103 return str(listen)
106def get_tree_graph(tree, parser, format=TreeGraphListener):
107 """
108 Returns a graph with :epkg:`networkx`.
110 @param tree from @see fn parse_code
111 @param parser the parser used to build the tree, output of @see fn parse_code
112 @param format None or a class `ParseTreeListener <https://github.com/antlr/antlr4-python3/blob/master/src/antlr4/tree/Tree.py>`_
113 @return string
114 """
115 if format is None:
116 raise TypeError( # pragma: no cover
117 "format cannot be None")
118 walker = ParseTreeWalker()
119 listen = format(parser)
120 walker.walk(listen, tree)
121 return listen