aboutsummaryrefslogtreecommitdiff
path: root/antlr-3.4/runtime/Python/tests/t044trace.py
blob: 13c9b761bb08b362d4e4a2f42ce9667ed3c4b513 (plain)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import antlr3
import testbase
import unittest


class T(testbase.ANTLRTest):
    def setUp(self):
        self.compileGrammar(options='-trace')


    def lexerClass(self, base):
        class TLexer(base):
            def __init__(self, *args, **kwargs):
                base.__init__(self, *args, **kwargs)

                self.traces = []


            def traceIn(self, ruleName, ruleIndex):
                self.traces.append('>'+ruleName)


            def traceOut(self, ruleName, ruleIndex):
                self.traces.append('<'+ruleName)


            def recover(self, input, re):
                # no error recovery yet, just crash!
                raise

        return TLexer


    def parserClass(self, base):
        class TParser(base):
            def __init__(self, *args, **kwargs):
                base.__init__(self, *args, **kwargs)

                self.traces = []


            def traceIn(self, ruleName, ruleIndex):
                self.traces.append('>'+ruleName)


            def traceOut(self, ruleName, ruleIndex):
                self.traces.append('<'+ruleName)


            def recover(self, input, re):
                # no error recovery yet, just crash!
                raise

            def getRuleInvocationStack(self):
                return self._getRuleInvocationStack(base.__module__)

        return TParser


    def testTrace(self):
        cStream = antlr3.StringStream('< 1 + 2 + 3 >')
        lexer = self.getLexer(cStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = self.getParser(tStream)
        parser.a()

        self.failUnlessEqual(
            lexer.traces,
            [ '>T__7', '<T__7', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
              '>T__6', '<T__6', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
              '>T__6', '<T__6', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
              '>T__8', '<T__8']
            )

        self.failUnlessEqual(
            parser.traces,
            [ '>a', '>synpred1_t044trace_fragment', '<synpred1_t044trace_fragment', '>b', '>c',
              '<c', '>c', '<c', '>c', '<c', '<b', '<a' ]
            )


    def testInvokationStack(self):
        cStream = antlr3.StringStream('< 1 + 2 + 3 >')
        lexer = self.getLexer(cStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = self.getParser(tStream)
        parser.a()

        self.failUnlessEqual(
            parser._stack,
            ['a', 'b', 'c']
            )

if __name__ == '__main__':
    unittest.main()