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

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 

10 

11 

12def get_parser_lexer(language): 

13 """ 

14 Returns two classes, a parser and a lexer from :epkg:`antlr4`. 

15 

16 @param language to analyse 

17 @return Parser, Lexer 

18 """ 

19 try: 

20 if language == "C#" or language == "CSharp": 

21 language = "CSharp4" 

22 

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 

67 

68 

69def parse_code(code, class_parser, class_lexer): 

70 """ 

71 Parses a code and returns a tree. 

72 

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) 

81 

82 lexer = class_lexer(code) 

83 stream = CommonTokenStream(lexer) 

84 parser = class_parser(stream) 

85 return parser 

86 

87 

88def get_tree_string(tree, parser, format=TreeStringListener): 

89 """ 

90 Returns a string which shows the parsed tree. 

91 

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) 

104 

105 

106def get_tree_graph(tree, parser, format=TreeGraphListener): 

107 """ 

108 Returns a graph with :epkg:`networkx`. 

109 

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