| import unittest |
| import textwrap |
| import antlr3 |
| import antlr3.tree |
| import testbase |
| |
| class T(testbase.ANTLRTest): |
| def walkerClass(self, base): |
| class TWalker(base): |
| def __init__(self, *args, **kwargs): |
| base.__init__(self, *args, **kwargs) |
| self.buf = "" |
| |
| def traceIn(self, ruleName, ruleIndex): |
| self.traces.append('>'+ruleName) |
| |
| |
| def traceOut(self, ruleName, ruleIndex): |
| self.traces.append('<'+ruleName) |
| |
| |
| def recover(self, input, re): |
| # no error recovery yet, just crash! |
| raise |
| |
| return TWalker |
| |
| |
| def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): |
| lexerCls, parserCls = self.compileInlineGrammar(grammar) |
| walkerCls = self.compileInlineGrammar(treeGrammar) |
| |
| cStream = antlr3.StringStream(input) |
| lexer = lexerCls(cStream) |
| tStream = antlr3.CommonTokenStream(lexer) |
| parser = parserCls(tStream) |
| r = getattr(parser, grammarEntry)() |
| nodes = antlr3.tree.CommonTreeNodeStream(r.tree) |
| nodes.setTokenStream(tStream) |
| walker = walkerCls(nodes) |
| r = getattr(walker, treeEntry)() |
| |
| if r.tree is not None: |
| return r.tree.toStringTree() |
| |
| return "" |
| |
| |
| def testFlatList(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T1; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP1; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T1; |
| } |
| |
| a : ID INT -> INT ID; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("34 abc", found) |
| |
| |
| def testSimpleTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T2; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP2; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T2; |
| } |
| a : ^(ID INT) -> ^(INT ID); |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(34 abc)", found) |
| |
| |
| def testCombinedRewriteAndAuto(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T3; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT) | INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP3; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T3; |
| } |
| a : ^(ID INT) -> ^(INT ID) | INT; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(34 abc)", found) |
| |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "34" |
| ) |
| |
| self.failUnlessEqual("34", found) |
| |
| |
| def testAvoidDup(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T4; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP4; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T4; |
| } |
| a : ID -> ^(ID ID); |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc" |
| ) |
| |
| self.failUnlessEqual("(abc abc)", found) |
| |
| |
| def testLoop(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T5; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID+ INT+ -> (^(ID INT))+ ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP5; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T5; |
| } |
| a : (^(ID INT))+ -> INT+ ID+; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a b c 3 4 5" |
| ) |
| |
| self.failUnlessEqual("3 4 5 a b c", found) |
| |
| |
| def testAutoDup(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T6; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP6; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T6; |
| } |
| a : ID; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc" |
| ) |
| |
| self.failUnlessEqual("abc", found) |
| |
| |
| def testAutoDupRule(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T7; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP7; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T7; |
| } |
| a : b c ; |
| b : ID ; |
| c : INT ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 1" |
| ) |
| |
| self.failUnlessEqual("a 1", found) |
| |
| |
| def testAutoWildcard(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python;output=AST;} |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| a : ID . |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34") |
| self.assertEquals("abc 34", found) |
| |
| |
| # def testNoWildcardAsRootError(self): |
| # ErrorQueue equeue = new ErrorQueue(); |
| # ErrorManager.setErrorListener(equeue); |
| # > |
| # String treeGrammar = |
| # "tree grammar TP;\n"+ |
| # "options {language=Python;output=AST;} |
| # "a : ^(. INT) |
| # " ;\n"; |
| # > |
| # Grammar g = new Grammar(treeGrammar); |
| # Tool antlr = newTool(); |
| # antlr.setOutputDirectory(null); // write to /dev/null |
| # CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); |
| # g.setCodeGenerator(generator); |
| # generator.genRecognizer(); |
| # > |
| # assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size()); |
| # > |
| # int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT; |
| # Object expectedArg = null; |
| # antlr.RecognitionException expectedExc = null; |
| # GrammarSyntaxMessage expectedMessage = |
| # new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc); |
| # > |
| # checkError(equeue, expectedMessage); |
| # } |
| |
| def testAutoWildcard2(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python;output=AST;} |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| a : ^(ID .) |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34") |
| self.assertEquals("(abc 34)", found) |
| |
| |
| def testAutoWildcardWithLabel(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python;output=AST;} |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| a : ID c=. |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34") |
| self.assertEquals("abc 34", found) |
| |
| |
| def testAutoWildcardWithListLabel(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python;output=AST;} |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| a : ID c+=. |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34") |
| self.assertEquals("abc 34", found) |
| |
| |
| def testAutoDupMultiple(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T8; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID ID INT; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP8; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T8; |
| } |
| a : ID ID INT |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a b 3" |
| ) |
| |
| self.failUnlessEqual("a b 3", found) |
| |
| |
| def testAutoDupTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T9; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP9; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T9; |
| } |
| a : ^(ID INT) |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupTreeWithLabels(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T10; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP10; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T10; |
| } |
| a : ^(x=ID y=INT) |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupTreeWithListLabels(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T11; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP11; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T11; |
| } |
| a : ^(x+=ID y+=INT) |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupTreeWithRuleRoot(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T12; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP12; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T12; |
| } |
| a : ^(b INT) ; |
| b : ID ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupTreeWithRuleRootAndLabels(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T13; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP13; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T13; |
| } |
| a : ^(x=b INT) ; |
| b : ID ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupTreeWithRuleRootAndListLabels(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T14; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP14; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T14; |
| } |
| a : ^(x+=b y+=c) ; |
| b : ID ; |
| c : INT ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a 3" |
| ) |
| |
| self.failUnlessEqual("(a 3)", found) |
| |
| |
| def testAutoDupNestedTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T15; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : x=ID y=ID INT -> ^($x ^($y INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP15; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T15; |
| } |
| a : ^(ID ^(ID INT)) |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "a b 3" |
| ) |
| |
| self.failUnlessEqual("(a (b 3))", found) |
| |
| |
| def testDelete(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T16; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP16; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T16; |
| } |
| a : ID -> |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc" |
| ) |
| |
| self.failUnlessEqual("", found) |
| |
| def testSetMatchNoRewrite(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| a : b INT; |
| b : ID | INT; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("abc 34", found) |
| |
| |
| def testSetOptionalMatchNoRewrite(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| a : (ID|INT)? INT ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34") |
| |
| self.failUnlessEqual("abc 34", found) |
| |
| |
| def testSetMatchNoRewriteLevel2(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : x=ID INT -> ^($x INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| a : ^(ID (ID | INT) ) ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(abc 34)", found) |
| |
| |
| def testSetMatchNoRewriteLevel2Root(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : x=ID INT -> ^($x INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| a : ^((ID | INT) INT) ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(abc 34)", found) |
| |
| |
| ## REWRITE MODE |
| |
| def testRewriteModeCombinedRewriteAndAuto(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T17; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID INT) | INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP17; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T17; |
| rewrite=true; |
| } |
| a : ^(ID INT) -> ^(ID["ick"] INT) |
| | INT // leaves it alone, returning $a.start |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(ick 34)", found) |
| |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "34" |
| ) |
| |
| self.failUnlessEqual("34", found) |
| |
| |
| def testRewriteModeFlatTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T18; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ID INT | INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP18; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T18; |
| rewrite=true; |
| } |
| s : ID a ; |
| a : INT -> INT["1"] |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34" |
| ) |
| self.assertEquals("abc 1", found) |
| |
| |
| def testRewriteModeChainRuleFlatTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ID INT | INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : a ; |
| a : b ; |
| b : ID INT -> INT ID |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.assertEquals("34 abc", found) |
| |
| |
| def testRewriteModeChainRuleTree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID INT) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : a ; |
| a : b ; // a.tree must become b.tree |
| b : ^(ID INT) -> INT |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.assertEquals("34", found) |
| |
| |
| def testRewriteModeChainRuleTree2(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID INT) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| tokens { X; } |
| s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree |
| a : X ; |
| b : ^(ID INT) -> INT |
| ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.assertEquals("34", found) |
| |
| |
| def testRewriteModeChainRuleTree3(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : 'boo' ID INT -> 'boo' ^(ID INT) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| tokens { X; } |
| s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo' |
| a : X ; |
| b : ^(ID INT) -> INT |
| ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "boo abc 34") |
| self.assertEquals("boo 34", found) |
| |
| |
| def testRewriteModeChainRuleTree4(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| tokens { X; } |
| s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo' |
| a : X ; |
| b : ^(ID INT) -> INT |
| ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "boo abc 34") |
| self.assertEquals("(boo 34)", found) |
| |
| |
| def testRewriteModeChainRuleTree5(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| tokens { X; } |
| s : ^(a b) ; // s.tree is a.tree |
| a : 'boo' ; |
| b : ^(ID INT) -> INT |
| ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "boo abc 34") |
| self.assertEquals("(boo 34)", found) |
| |
| |
| def testRewriteOfRuleRef(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ID INT | INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : a -> a ; |
| a : ID INT -> ID INT ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.failUnlessEqual("abc 34", found) |
| |
| |
| def testRewriteOfRuleRefRoot(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT INT -> ^(INT ^(ID INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(a ^(ID INT)) -> a ; |
| a : INT ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 12 34") |
| # emits whole tree when you ref the root since I can't know whether |
| # you want the children or not. You might be returning a whole new |
| # tree. Hmm...still seems weird. oh well. |
| self.failUnlessEqual("(12 (abc 34))", found) |
| |
| |
| def testRewriteOfRuleRefRootLabeled(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT INT -> ^(INT ^(ID INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(label=a ^(ID INT)) -> a ; |
| a : INT ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 12 34") |
| # emits whole tree when you ref the root since I can't know whether |
| # you want the children or not. You might be returning a whole new |
| # tree. Hmm...still seems weird. oh well. |
| self.failUnlessEqual("(12 (abc 34))", found) |
| |
| |
| def testRewriteOfRuleRefRootListLabeled(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT INT -> ^(INT ^(ID INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(label+=a ^(ID INT)) -> a ; |
| a : INT ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 12 34") |
| # emits whole tree when you ref the root since I can't know whether |
| # you want the children or not. You might be returning a whole new |
| # tree. Hmm...still seems weird. oh well. |
| self.failUnlessEqual("(12 (abc 34))", found) |
| |
| |
| def testRewriteOfRuleRefChild(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID ^(INT INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(ID a) -> a ; |
| a : ^(INT INT) ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.failUnlessEqual("(34 34)", found) |
| |
| |
| def testRewriteOfRuleRefLabel(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID ^(INT INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(ID label=a) -> a ; |
| a : ^(INT INT) ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.failUnlessEqual("(34 34)", found) |
| |
| |
| def testRewriteOfRuleRefListLabel(self): |
| grammar = textwrap.dedent( |
| r""" |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID ^(INT INT)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| """) |
| |
| treeGrammar = textwrap.dedent( |
| r""" |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(ID label+=a) -> a ; |
| a : ^(INT INT) ; |
| """) |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.failUnlessEqual("(34 34)", found) |
| |
| |
| |
| def testRewriteModeWithPredicatedRewrites(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T19; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP19; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T19; |
| rewrite=true; |
| } |
| s : ^(ID a) { self.buf += $s.start.toStringTree() }; |
| a : ^(ID INT) -> {True}? ^(ID["ick"] INT) |
| -> INT |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("(root (ick 34))", found) |
| |
| |
| def testWildcardSingleNode(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID INT -> ^(ID["root"] INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| s : ^(ID c=.) -> $c |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34" |
| ) |
| |
| self.failUnlessEqual("34", found) |
| |
| def testWildcardUnlabeledSingleNode(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID INT -> ^(ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| s : ^(ID .) -> ID |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 34") |
| self.assertEquals("abc", found) |
| |
| |
| def testWildcardGrabsSubtree(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| s : ^(ID c=.) -> $c |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 1 2 3") |
| self.assertEquals("(1 2 3)", found) |
| |
| |
| def testWildcardGrabsSubtree2(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : ID x=INT y=INT z=INT -> ID ^($x $y $z); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| s : ID c=. -> $c |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "abc 1 2 3") |
| self.assertEquals("(1 2 3)", found) |
| |
| |
| def testWildcardListLabel(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST;} |
| a : INT INT INT ; |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} |
| s : (c+=.)+ -> $c+ |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "1 2 3") |
| self.assertEquals("1 2 3", found) |
| |
| |
| def testWildcardListLabel2(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options {language=Python; output=AST; ASTLabelType=CommonTree;} |
| a : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z)); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} |
| s : ^(INT (c+=.)+) -> $c+ |
| ; |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 's', |
| "1 2 3") |
| self.assertEquals("(2 3) (2 3)", found) |
| |
| |
| def testRuleResultAsRoot(self): |
| grammar = textwrap.dedent( |
| r''' |
| grammar T; |
| options { |
| language=Python; |
| output=AST; |
| } |
| a : ID '=' INT -> ^('=' ID INT); |
| ID : 'a'..'z'+ ; |
| INT : '0'..'9'+; |
| COLON : ':' ; |
| WS : (' '|'\n') {$channel=HIDDEN;} ; |
| ''') |
| |
| treeGrammar = textwrap.dedent( |
| r''' |
| tree grammar TP; |
| options { |
| language=Python; |
| output=AST; |
| rewrite=true; |
| ASTLabelType=CommonTree; |
| tokenVocab=T; |
| } |
| a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ; |
| eq : '=' | ':' {pass} ; // bug in set match, doesn't add to tree!! booh. force nonset. |
| ''') |
| |
| found = self.execTreeParser( |
| grammar, 'a', |
| treeGrammar, 'a', |
| "abc = 34") |
| self.assertEquals("(= 34 abc)", found) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |