diff --git a/DHParser/dsl.py b/DHParser/dsl.py index 5ea3d76ea5a1a78c054c00a00466b358f9a02547..514b1d8d8cac837916369a65d0ed38d1de7fa1a4 100644 --- a/DHParser/dsl.py +++ b/DHParser/dsl.py @@ -124,16 +124,16 @@ if __name__ == "__main__": ''' -def get_grammar_instance(grammar): +def grammar_instance(grammar_representation): """Returns a grammar object and the source code of the grammar, from the given `grammar`-data which can be either a file name, ebnf-code, python-code, a GrammarBase-derived grammar class or an instance of such a class (i.e. a grammar object already). """ - if isinstance(grammar, str): + if isinstance(grammar_representation, str): # read grammar - grammar_src = load_if_file(grammar) - if is_python_code(grammar): + grammar_src = load_if_file(grammar_representation) + if is_python_code(grammar_representation): parser_py, errors, AST = grammar_src, '', None else: parser_py, errors, AST = full_compilation(grammar_src, None, @@ -144,11 +144,11 @@ def get_grammar_instance(grammar): else: # assume that dsl_grammar is a ParserHQ-object or Grammar class grammar_src = '' - if isinstance(grammar, GrammarBase): - parser_root = grammar + if isinstance(grammar_representation, GrammarBase): + parser_root = grammar_representation else: # assume `grammar` is a grammar class and get the root object - parser_root = grammar() + parser_root = grammar_representation() return parser_root, grammar_src @@ -162,7 +162,7 @@ def compileDSL(text_or_file, scanner, dsl_grammar, ast_transformation, compiler) """ assert isinstance(text_or_file, str) assert isinstance(compiler, CompilerBase) - parser_root, grammar_src = get_grammar_instance(dsl_grammar) + parser_root, grammar_src = grammar_instance(dsl_grammar) src = load_if_file(text_or_file) result, errors, AST = full_compilation(src, scanner, parser_root, ast_transformation, compiler) diff --git a/DHParser/parsers.py b/DHParser/parsers.py index 722142eba5aae9eb4798ac05519a6789ad443ab4..3512b8c456e809bdaf3f703f0fc4f02ef92e4752 100644 --- a/DHParser/parsers.py +++ b/DHParser/parsers.py @@ -332,6 +332,9 @@ class GrammarBase: Args: document (str): The source text to be parsed. + start_parser (str): The name of the parser with which to + start. This is useful for testing particular parsers + (i.e. particular parts of the EBNF-Grammar.) Returns: Node: The root node ot the parse tree. """ diff --git a/DHParser/syntaxtree.py b/DHParser/syntaxtree.py index 6b6e8784d50c90599ea6347af512865cd5e92af6..0dddebd2af4043841c30e9cac15205b09304d936 100644 --- a/DHParser/syntaxtree.py +++ b/DHParser/syntaxtree.py @@ -20,8 +20,6 @@ permissions and limitations under the License. import itertools import os from functools import partial - - try: import regex as re except ImportError: @@ -165,9 +163,12 @@ class Node: return "".join(str(child) for child in self.result) return str(self.result) + def __eq__(self, other): + return str(self.parser) == str(other.parser) and self.result == other.result + @property def tag_name(self): - return self.parser.name or self.parser.__class__.__name__ + return str(self.parser) # ONLY FOR DEBUGGING: return self.parser.name + ':' + self.parser.__class__.__name__ @property diff --git a/examples/DHParser-Testbed/Testbed.ebnf b/OLDSTUFF/DHParser-Testbed/Testbed.ebnf similarity index 100% rename from examples/DHParser-Testbed/Testbed.ebnf rename to OLDSTUFF/DHParser-Testbed/Testbed.ebnf diff --git a/examples/DHParser-Testbed/example.tb b/OLDSTUFF/DHParser-Testbed/example.tb similarity index 100% rename from examples/DHParser-Testbed/example.tb rename to OLDSTUFF/DHParser-Testbed/example.tb diff --git a/examples/DHParser-Testbed/readme.md b/OLDSTUFF/DHParser-Testbed/readme.md similarity index 100% rename from examples/DHParser-Testbed/readme.md rename to OLDSTUFF/DHParser-Testbed/readme.md diff --git a/test/test_syntaxtree.py b/test/test_syntaxtree.py index 62acab2ea57a7b7020f71815d21326a349b34b13..faf7487b1d144dbe7e93b97707e9b294f7c15efb 100644 --- a/test/test_syntaxtree.py +++ b/test/test_syntaxtree.py @@ -85,6 +85,11 @@ class TestNode: assert len(found) == 2 assert found[0].result == 'x' and found[1].result == 'y' + def test_equality(self): + assert self.unique_tree == self.unique_tree + assert self.recurr_tree != self.unique_tree + assert mock_syntax_tree('(a (b c))') != mock_syntax_tree('(a (b d))') + class TestErrorHandling: def test_error_flag_propagation(self): @@ -101,4 +106,4 @@ class TestErrorHandling: if __name__ == "__main__": from run import runner - runner("", globals()) + runner("TestNode", globals())