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