test_parsercombinators.py 2.82 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python3

"""test_parsercombinators.py - tests of the parsercombinators-module 
                               of DHParser 


Author: Eckhart Arnold <arnold@badw.de>

Copyright 2017 Bavarian Academy of Sciences and Humanities

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""

import os
import sys

sys.path.append(os.path.abspath('../../'))
28
29
30
31
from DHParser.toolkit import compile_python_object
from DHParser.parsercombinators import full_compilation
from DHParser.EBNFcompiler import EBNFGrammar, EBNF_ASTPipeline, EBNFCompiler
from DHParser.DSLsupport import compileEBNF, DHPARSER_IMPORTS
32
33
34
35
36
37
38

WRITE_LOGS = True


class TestLeftRecursion:
    mini_language1 = """
        @ whitespace = linefeed
39
        formula = [ //~ ] expr
40
41
        expr = expr ("+"|"-") term | term
        term = term ("*"|"/") factor | factor
42
        factor = /[0-9]+/~
43
44
45
46
47
48
49
50
51
52
        # example:  "5 + 3 * 4"
        """

    def setup(self):
        self.minilang_parser1 = compileEBNF(self.mini_language1)()

    def test_compile_mini_language(self):
        assert self.minilang_parser1

    def test_direct_left_recursion(self):
53
54
        snippet = "5 + 3 * 4"
        syntax_tree = self.minilang_parser1.parse(snippet)
55
        assert not syntax_tree.collect_errors()
56
        assert snippet == str(syntax_tree)
57
58
        if WRITE_LOGS:
            syntax_tree.log("test_LeftRecursion_direct", '.cst')
Eckhart Arnold's avatar
Eckhart Arnold committed
59
            # self.minilang_parser1.log_parsing_history("test_LeftRecursion_direct")
60
61
62
63
64

    def test_indirect_left_recursion(self):
        pass


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
class TestRegex:
    def test_multilineRegex(self):
        mlregex = r"""
        regex =  /\w+    # one or more alphabetical characters including the underscore
                  [+]    # followed by a plus sign
                  \w*    # possibly followed by more alpha chracters/
        """
        result, messages, syntax_tree = full_compilation(mlregex, EBNFGrammar(), EBNF_ASTPipeline,
                                                         EBNFCompiler('MultilineRegexTest'))
        assert result is not None, messages
        assert not messages
        parser = compile_python_object(DHPARSER_IMPORTS + result, '\w+Grammar$')()
        node, rest = parser.regex('abc+def')
        assert rest == ''
        assert node.parser.name == "regex"
        assert str(node) == 'abc+def'


83
84
if __name__ == "__main__":
    from run import run_tests
85
86

    run_tests("TestRegex", globals())