1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest):
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.oldPath = sys.path[:]
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.path.insert(0, self.baseDir)
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def tearDown(self):
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.path = self.oldPath
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def parserClass(self, base):
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TParser(base):
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input, re):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TParser
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def lexerClass(self, base):
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TLexer(base):
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input):
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TLexer
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execParser(self, grammar, grammarEntry, slaves, input):
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for slave in slaves:
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            parserName = self.writeInlineGrammar(slave)[0]
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # slave parsers are imported as normal python modules
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # to force reloading current version, purge module from sys.modules
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try:
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                del sys.modules[parserName+'Parser']
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            except KeyError:
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                pass
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        getattr(parser, grammarEntry)()
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return parser._output
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execLexer(self, grammar, slaves, input):
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for slave in slaves:
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            parserName = self.writeInlineGrammar(slave)[0]
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # slave parsers are imported as normal python modules
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # to force reloading current version, purge module from sys.modules
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try:
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                del sys.modules[parserName+'Parser']
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            except KeyError:
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                pass
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls = self.compileInlineGrammar(grammar)
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        while True:
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            token = lexer.nextToken()
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if token is None or token.type == antlr3.EOF:
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                break
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            lexer._output += token.text
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return lexer._output
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # @Test public void testWildcardStillWorks() throws Exception {
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     ErrorQueue equeue = new ErrorQueue();
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     ErrorManager.setErrorListener(equeue);
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     String grammar =
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     "parser grammar S;\n" +
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     "a : B . C ;\n"; // not qualified ID
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     Grammar g = new Grammar(grammar);
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     }
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatorInvokesDelegateRule(self):
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S1;
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM1.capture(t)
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : B { self.capture("S.a") } ;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M1;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S1;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s : a ;
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        B : 'b' ; // defines B from inherited token space
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 's',
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="b"
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.a", found)
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testDelegatorInvokesDelegateRuleWithReturnStruct() throws Exception {
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #     // must generate something like:
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #          // public int a(int x) throws RecognitionException { return gS.a(x); }
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        // in M.
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        String slave =
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "parser grammar S;\n" +
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "a : B {System.out.print(\"S.a\");} ;\n";
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        mkdir(tmpdir);
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        writeFile(tmpdir, "S.g", slave);
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        String master =
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "grammar M;\n" +
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "import S;\n" +
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "s : a {System.out.println($a.text);} ;\n" +
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "B : 'b' ;" + // defines B from inherited token space
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        "WS : (' '|'\\n') {skip();} ;\n" ;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        String found = execParser("M.g", master, "MParser", "MLexer",
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                    "s", "b", debug);
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        assertEquals("S.ab\n", found);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #        }
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatorInvokesDelegateRuleWithArgs(self):
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S2;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM2.capture(t)
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a[x] returns [y] : B {self.capture("S.a"); $y="1000";} ;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M2;
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S2;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s : label=a[3] {self.capture($label.y);} ;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        B : 'b' ; // defines B from inherited token space
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 's',
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="b"
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.a1000", found)
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatorAccessesDelegateMembers(self):
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S3;
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM3.capture(t)
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def foo(self):
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.capture("foo")
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : B ;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M3;        // uses no rules from the import
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S3;
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s : 'b' {self.gS3.foo();} ; // gS is import pointer
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 's',
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="b"
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("foo", found)
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatorInvokesFirstVersionOfDelegateRule(self):
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S4;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM4.capture(t)
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : b {self.capture("S.a");} ;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        b : B ;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave2 = textwrap.dedent(
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar T4;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM4.capture(t)
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : B {self.capture("T.a");} ; // hidden by S.a
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M4;
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S4,T4;
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s : a ;
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        B : 'b' ;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 's',
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave, slave2],
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="b"
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.a", found)
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatesSeeSameTokenType(self):
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S5; // A, B, C token type order
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { A; B; C; }
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM5.capture(t)
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        x : A {self.capture("S.x ");} ;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave2 = textwrap.dedent(
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar T5;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens { C; B; A; } /// reverse order
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM5.capture(t)
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        y : A {self.capture("T.y");} ;
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M5;
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S5,T5;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s : x y ; // matches AA, which should be "aa"
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        B : 'b' ; // another order: B, A, C
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        A : 'a' ;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        C : 'c' ;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 's',
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave, slave2],
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="aa"
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.x T.y", found)
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testDelegatesSeeSameTokenType2() throws Exception {
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" + // A, B, C token type order
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A; B; C; }\n" +
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : A {System.out.println(\"S.x\");} ;\n";
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave2 =
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { C; B; A; }\n" + // reverse order
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "y : A {System.out.println(\"T.y\");} ;\n";
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave2);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S,T;\n" +
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x y ;\n" + // matches AA, which should be "aa"
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "B : 'b' ;\n" + // another order: B, A, C
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'a' ;\n" +
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "C : 'c' ;\n" +
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[A=4, B=5, C=6, WS=7]";
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{}";
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[A, B, C, WS]";
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testCombinedImportsCombined() throws Exception {
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // for now, we don't allow combined to import combined
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar S;\n" + // A, B, C token type order
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A; B; C; }\n" +
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : 'x' INT {System.out.println(\"S.x\");} ;\n" +
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "INT : '0'..'9'+ ;\n" +
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n";
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x INT ;\n";
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError = "error(161): "+tmpdir.toString().replaceFirst("\\-[0-9]+","")+"/M.g:2:8: combined grammar M cannot import combined grammar S";
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, expectedError, equeue.errors.get(0).toString().replaceFirst("\\-[0-9]+",""));
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testSameStringTwoNames() throws Exception {
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A='a'; }\n" +
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : A {System.out.println(\"S.x\");} ;\n";
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave2 =
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { X='a'; }\n" +
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "y : X {System.out.println(\"T.y\");} ;\n";
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave2);
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S,T;\n" +
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x y ;\n" +
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[A=4, WS=6, X=5]";
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{'a'=4}";
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[A, X, WS]";
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Object expectedArg = "X='a'";
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Object expectedArg2 = "A";
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         int expectedMsgID = ErrorManager.MSG_TOKEN_ALIAS_CONFLICT;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         GrammarSemanticsMessage expectedMessage =
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         checkGrammarSemanticsError(equeue, expectedMessage);
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError =
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "error(158): T.g:2:10: cannot alias X='a'; string already assigned to A";
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedError, equeue.errors.get(0).toString());
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testSameNameTwoStrings() throws Exception {
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A='a'; }\n" +
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : A {System.out.println(\"S.x\");} ;\n";
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave2 =
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A='x'; }\n" +
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "y : A {System.out.println(\"T.y\");} ;\n";
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave2);
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S,T;\n" +
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x y ;\n" +
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[A=4, T__6=6, WS=5]";
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{'a'=4, 'x'=6}";
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[A, WS, T__6]";
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, sortMapToString(g.composite.stringLiteralToTypeMap));
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Object expectedArg = "A='x'";
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Object expectedArg2 = "'a'";
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         int expectedMsgID = ErrorManager.MSG_TOKEN_ALIAS_REASSIGNMENT;
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         GrammarSemanticsMessage expectedMessage =
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         checkGrammarSemanticsError(equeue, expectedMessage);
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError =
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "error(159): T.g:2:10: cannot alias A='x'; token name already assigned to 'a'";
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedError, equeue.errors.get(0).toString());
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testImportedTokenVocabIgnoredWithWarning() throws Exception {
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "options {tokenVocab=whatever;}\n" +
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A='a'; }\n" +
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : A {System.out.println(\"S.x\");} ;\n";
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x ;\n" +
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Object expectedArg = "S";
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         int expectedMsgID = ErrorManager.MSG_TOKEN_VOCAB_IN_DELEGATE;
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         GrammarSemanticsMessage expectedMessage =
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         checkGrammarSemanticsWarning(equeue, expectedMessage);
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 1, equeue.warnings.size());
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError =
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "warning(160): S.g:2:10: tokenVocab option ignored in imported grammar S";
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedError, equeue.warnings.get(0).toString());
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testImportedTokenVocabWorksInRoot() throws Exception {
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tokens { A='a'; }\n" +
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : A {System.out.println(\"S.x\");} ;\n";
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String tokens =
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A=99\n";
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "Test.tokens", tokens);
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "options {tokenVocab=Test;}\n" +
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x ;\n" +
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[A=99, WS=101]";
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{'a'=100}";
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[A, 'a', WS]";
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testSyntaxErrorsInImportsNotThrownOut() throws Exception {
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "options {toke\n";
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x ;\n" +
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // whole bunch of errors from bad S.g file
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 5, equeue.errors.size());
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testSyntaxErrorsInImportsNotThrownOut2() throws Exception {
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 ": A {System.out.println(\"S.x\");} ;\n";
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : x ;\n" +
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // whole bunch of errors from bad S.g file
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 3, equeue.errors.size());
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDelegatorRuleOverridesDelegate(self):
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser grammar S6;
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM6.capture(t)
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : b {self.capture("S.a");} ;
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        b : B ;
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar M6;
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S6;
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        b : 'b'|'c' ;
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master, 'a',
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="c"
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.a", found)
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     @Test public void testDelegatorRuleOverridesLookaheadInDelegate() throws Exception {
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             String slave =
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "parser grammar JavaDecl;\n" +
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "type : 'int' ;\n" +
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "decl : type ID ';'\n" +
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "     | type ID init ';' {System.out.println(\"JavaDecl: \"+$decl.text);}\n" +
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "     ;\n" +
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "init : '=' INT ;\n" ;
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             mkdir(tmpdir);
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             writeFile(tmpdir, "JavaDecl.g", slave);
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             String master =
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "grammar Java;\n" +
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "import JavaDecl;\n" +
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "prog : decl ;\n" +
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "type : 'int' | 'float' ;\n" +
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "\n" +
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "ID  : 'a'..'z'+ ;\n" +
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "INT : '0'..'9'+ ;\n" +
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                     "WS : (' '|'\\n') {skip();} ;\n" ;
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             // for float to work in decl, type must be overridden
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             String found = execParser("Java.g", master, "JavaParser", "JavaLexer",
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                                                               "prog", "float x = 3;", debug);
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #             assertEquals("JavaDecl: floatx=3;\n", found);
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     }
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # @Test public void testDelegatorRuleOverridesDelegates() throws Exception {
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     String slave =
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "parser grammar S;\n" +
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "a : b {System.out.println(\"S.a\");} ;\n" +
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "b : B ;\n" ;
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     mkdir(tmpdir);
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     writeFile(tmpdir, "S.g", slave);
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     String slave2 =
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "parser grammar T;\n" +
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "tokens { A='x'; }\n" +
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "b : B {System.out.println(\"T.b\");} ;\n";
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     writeFile(tmpdir, "T.g", slave2);
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     String master =
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "grammar M;\n" +
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "import S, T;\n" +
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "b : 'b'|'c' {System.out.println(\"M.b\");}|B|A ;\n" +
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #         "WS : (' '|'\\n') {skip();} ;\n" ;
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     String found = execParser("M.g", master, "MParser", "MLexer",
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                               "a", "c", debug);
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #     assertEquals("M.b\n" +
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #                  "S.a\n", found);
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # }
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # LEXER INHERITANCE
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLexerDelegatorInvokesDelegateRule(self):
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer grammar S7;
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM7.capture(t)
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        A : 'a' {self.capture("S.A ");} ;
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        C : 'c' ;
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer grammar M7;
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S7;
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        B : 'b' ;
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execLexer(
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master,
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="abc"
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("S.A abc", found)
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLexerDelegatorRuleOverridesDelegate(self):
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        slave = textwrap.dedent(
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer grammar S8;
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @members {
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.gM8.capture(t)
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        A : 'a' {self.capture("S.A")} ;
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        master = textwrap.dedent(
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer grammar M8;
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import S8;
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        A : 'a' {self.capture("M.A ");} ;
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {self.skip()} ;
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execLexer(
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            master,
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            slaves=[slave],
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input="a"
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("M.A a", found)
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testLexerDelegatorRuleOverridesDelegateLeavingNoRules() throws Exception {
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // M.Tokens has nothing to predict tokens from S.  Should
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // not include S.Tokens alt in this case?
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar S;\n" +
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'a' {System.out.println(\"S.A\");} ;\n";
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar M;\n" +
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'a' {System.out.println(\"M.A\");} ;\n" +
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "/M.g", master);
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.assignTokenTypes();
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.defineGrammarSymbols();
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.createNFAs();
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.createLookaheadDFAs(false);
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // predict only alts from M not S
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectingDFA =
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 ".s0-'a'->.s1\n" +
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 ".s0-{'\\n', ' '}->:s3=>2\n" +
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 ".s1-<EOT>->:s2=>1\n";
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         org.antlr.analysis.DFA dfa = g.getLookaheadDFA(1);
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         FASerializer serializer = new FASerializer(g);
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String result = serializer.serialize(dfa.startState);
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectingDFA, result);
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // must not be a "unreachable alt: Tokens" error
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testInvalidImportMechanism() throws Exception {
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // M.Tokens has nothing to predict tokens from S.  Should
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // not include S.Tokens alt in this case?
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar S;\n" +
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'a' {System.out.println(\"S.A\");} ;\n";
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "tree grammar M;\n" +
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : A ;";
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "/M.g", master);
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.warnings.size());
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError =
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "error(161): "+tmpdir.toString().replaceFirst("\\-[0-9]+","")+"/M.g:2:8: tree grammar M cannot import lexer grammar S";
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedError, equeue.errors.get(0).toString().replaceFirst("\\-[0-9]+",""));
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testSyntacticPredicateRulesAreNotInherited() throws Exception {
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // if this compiles, it means that synpred1_S is defined in S.java
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // but not MParser.java.  MParser has its own synpred1_M which must
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // be separate to compile.
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : 'a' {System.out.println(\"S.a1\");}\n" +
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "  | 'a' {System.out.println(\"S.a2\");}\n" +
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "  ;\n" +
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "b : 'x' | 'y' {;} ;\n"; // preds generated but not need in DFA here
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "options {backtrack=true;}\n" +
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "start : a b ;\n" +
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "nonsense : 'q' | 'q' {;} ;" + // forces def of preds here in M
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String found = execParser("M.g", master, "MParser", "MLexer",
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                                           "start", "ax", debug);
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("S.a1\n", found);
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testKeywordVSIDGivesNoWarning() throws Exception {
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar S;\n" +
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'abc' {System.out.println(\"S.A\");} ;\n" +
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "ID : 'a'..'z'+ ;\n";
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : A {System.out.println(\"M.a\");} ;\n" +
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String found = execParser("M.g", master, "MParser", "MLexer",
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                                           "a", "abc", debug);
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected warnings: "+equeue, 0, equeue.warnings.size());
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("S.A\nM.a\n", found);
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testWarningForUndefinedToken() throws Exception {
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar S;\n" +
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "A : 'abc' {System.out.println(\"S.A\");} ;\n";
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : ABC A {System.out.println(\"M.a\");} ;\n" +
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // A is defined in S but M should still see it and not give warning.
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // only problem is ABC.
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         rawGenerateAndBuildRecognizer("M.g", master, "MParser", "MLexer", debug);
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected warnings: "+equeue, 1, equeue.warnings.size());
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedError =
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "warning(105): "+tmpdir.toString().replaceFirst("\\-[0-9]+","")+"/M.g:3:5: no lexer rule corresponding to token: ABC";
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedError, equeue.warnings.get(0).toString().replaceFirst("\\-[0-9]+",""));
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # /** Make sure that M can import S that imports T. */
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void test3LevelImport() throws Exception {
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : T ;\n" ;
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave);
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave2 =
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" + // A, B, C token type order
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import T;\n" +
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : S ;\n" ;
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave2);
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : M ;\n" ;
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.defineGrammarSymbols();
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[M=6, S=5, T=4]";
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{}";
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[T, S, M]";
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean ok =
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 rawGenerateAndBuildRecognizer("M.g", master, "MParser", null, false);
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean expecting = true; // should be ok
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expecting, ok);
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testBigTreeOfImports() throws Exception {
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : T ;\n" ;
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave);
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         slave =
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import T;\n" +
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "y : S ;\n" ;
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         slave =
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar C;\n" +
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "i : C ;\n" ;
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "C.g", slave);
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         slave =
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar B;\n" +
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "j : B ;\n" ;
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "B.g", slave);
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         slave =
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar A;\n" +
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import B,C;\n" +
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "k : A ;\n" ;
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "A.g", slave);
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S,A;\n" +
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : M ;\n" ;
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.defineGrammarSymbols();
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[A=8, B=6, C=7, M=9, S=5, T=4]";
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{}";
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[T, S, B, C, A, M]";
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean ok =
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 rawGenerateAndBuildRecognizer("M.g", master, "MParser", null, false);
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean expecting = true; // should be ok
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expecting, ok);
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testRulesVisibleThroughMultilevelImport() throws Exception {
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar T;\n" +
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "x : T ;\n" ;
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "T.g", slave);
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave2 =
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" + // A, B, C token type order
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import T;\n" +
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : S ;\n" ;
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave2);
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : M x ;\n" ; // x MUST BE VISIBLE TO M
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "M.g", master);
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/M.g",composite);
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.defineGrammarSymbols();
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[M=6, S=5, T=4]";
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{}";
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[T, S, M]";
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testNestedComposite() throws Exception {
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         // Wasn't compiling. http://www.antlr.org/jira/browse/ANTLR-438
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorQueue equeue = new ErrorQueue();
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         ErrorManager.setErrorListener(equeue);
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String gstr =
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "lexer grammar L;\n" +
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "T1: '1';\n" +
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "T2: '2';\n" +
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "T3: '3';\n" +
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "T4: '4';\n" ;
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "L.g", gstr);
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         gstr =
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar G1;\n" +
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s: a | b;\n" +
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a: T1;\n" +
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "b: T2;\n" ;
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "G1.g", gstr);
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         gstr =
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar G2;\n" +
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import G1;\n" +
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a: T3;\n" ;
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "G2.g", gstr);
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String G3str =
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar G3;\n" +
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import G2;\n" +
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "b: T4;\n" ;
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "G3.g", G3str);
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Tool antlr = newTool(new String[] {"-lib", tmpdir});
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         CompositeGrammar composite = new CompositeGrammar();
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         Grammar g = new Grammar(antlr,tmpdir+"/G3.g",composite);
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         composite.setDelegationRoot(g);
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.parseAndBuildAST();
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.assignTokenTypes();
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         g.composite.defineGrammarSymbols();
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTokenIDToTypeMap = "[T1=4, T2=5, T3=6, T4=7]";
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedStringLiteralToTypeMap = "{}";
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String expectedTypeToTokenList = "[T1, T2, T3, T4]";
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTokenIDToTypeMap,
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.tokenIDToTypeMap).toString());
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expectedTypeToTokenList,
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                                  realElements(g.composite.typeToTokenList).toString());
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean ok =
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 rawGenerateAndBuildRecognizer("G3.g", G3str, "G3Parser", null, false);
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean expecting = true; // should be ok
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expecting, ok);
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # @Test public void testHeadersPropogatedCorrectlyToImportedGrammars() throws Exception {
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String slave =
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "parser grammar S;\n" +
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "a : B {System.out.print(\"S.a\");} ;\n";
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         mkdir(tmpdir);
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         writeFile(tmpdir, "S.g", slave);
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         String master =
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "grammar M;\n" +
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "import S;\n" +
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "@header{package mypackage;}\n" +
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "@lexer::header{package mypackage;}\n" +
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "s : a ;\n" +
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "B : 'b' ;" + // defines B from inherited token space
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #                 "WS : (' '|'\\n') {skip();} ;\n" ;
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean ok = antlr("M.g", "M.g", master, debug);
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         boolean expecting = true; // should be ok
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #         assertEquals(expecting, ok);
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # }
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
1204