Remove forward declaration of listener/visitor, and adjust test templates accordingly

This commit is contained in:
Eric Vergnaud 2015-06-21 19:14:42 +08:00
parent 70fa6b27f0
commit dfda30092e
3 changed files with 71 additions and 29 deletions

View File

@ -35,7 +35,6 @@
*
* REQUIRED.
*/
VERSION() ::= "4.3" // use just "x.y" and don't include bug fix release number
pythonTypeInitMap ::= [
"bool":"False",
@ -53,27 +52,10 @@ ParserFile(file, parser, namedActions) ::= <<
from __future__ import print_function
from antlr4 import *
from io import StringIO
<if(file.genListener || file.genVisitor)>
package = globals().get("__package__", None)
ischild = len(package)>0 if package is not None else False
if ischild:
<if(file.genListener)>
from .<file.parser.grammarName>Listener import <file.parser.grammarName>Listener
<endif>
<if(file.genVisitor)>
from .<file.parser.grammarName>Visitor import <file.parser.grammarName>Visitor
<endif>
else:
<if(file.genListener)>
from <file.parser.grammarName>Listener import <file.parser.grammarName>Listener
<endif>
<if(file.genVisitor)>
from <file.parser.grammarName>Visitor import <file.parser.grammarName>Visitor
<endif>
<endif>
<namedActions.header>
<parser>
>>
ListenerFile(file, header) ::= <<
@ -118,7 +100,7 @@ def visit<lname; format="cap">(self, ctx):
fileHeader(grammarFileName, ANTLRVersion) ::= <<
# Generated from <grammarFileName"> by ANTLR <ANTLRVersion>
# Generated from <grammarFileName> by ANTLR <ANTLRVersion>
>>
Parser(parser, funcs, atn, sempredFuncs, superClass) ::= <<
@ -693,14 +675,14 @@ class <struct.name>(<currentRule.name; format="cap">Context):
ListenerDispatchMethod(method) ::= <<
def <if(method.isEnter)>enter<else>exit<endif>Rule(self, listener):
if isinstance( listener, <parser.grammarName>Listener ):
if hasattr(listener, "<if(method.isEnter)>enter<else>exit<endif><struct.derivedFromName; format="cap">"):
listener.<if(method.isEnter)>enter<else>exit<endif><struct.derivedFromName; format="cap">(self)
>>
VisitorDispatchMethod(method) ::= <<
def accept(self, visitor):
if isinstance( visitor, <parser.grammarName>Visitor ):
if hasattr(visitor, "visit<struct.derivedFromName; format="cap">"):
return visitor.visit<struct.derivedFromName; format="cap">(self)
else:
return visitor.visitChildren(self)

View File

@ -297,6 +297,11 @@ def isIdentifierChar(c):
>>
BasicListener(X) ::= <<
if __name__ is not None and "." in __name__:
from .<X>Listener import <X>Listener
else:
from <X>Listener import <X>Listener
class LeafListener(TListener):
def visitTerminal(self, node):
print(node.symbol.text)
@ -309,6 +314,11 @@ walker.walk(TParser.LeafListener(), <s>)
>>
TokenGetterListener(X) ::= <<
if __name__ is not None and "." in __name__:
from .<X>Listener import <X>Listener
else:
from <X>Listener import <X>Listener
class LeafListener(TListener):
def exitA(self, ctx):
if ctx.getChildCount()==2:
@ -319,6 +329,11 @@ class LeafListener(TListener):
>>
RuleGetterListener(X) ::= <<
if __name__ is not None and "." in __name__:
from .<X>Listener import <X>Listener
else:
from <X>Listener import <X>Listener
class LeafListener(TListener):
def exitA(self, ctx):
if ctx.getChildCount()==2:
@ -330,6 +345,11 @@ class LeafListener(TListener):
LRListener(X) ::= <<
if __name__ is not None and "." in __name__:
from .<X>Listener import <X>Listener
else:
from <X>Listener import <X>Listener
class LeafListener(TListener):
def exitE(self, ctx):
if ctx.getChildCount()==3:
@ -340,6 +360,11 @@ class LeafListener(TListener):
>>
LRWithLabelsListener(X) ::= <<
if __name__ is not None and "." in __name__:
from .<X>Listener import <X>Listener
else:
from <X>Listener import <X>Listener
class LeafListener(TListener):
def exitCall(self, ctx):
print(ctx.e().start.text + ' ' + str(ctx.eList()))

View File

@ -12,12 +12,17 @@ public class TestListeners extends BasePython2Test {
public void testTokenGetters_1() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(535);
StringBuilder grammarBuilder = new StringBuilder(660);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitA(self, ctx):\n");
grammarBuilder.append(" if ctx.getChildCount()==2:\n");
@ -60,12 +65,17 @@ public class TestListeners extends BasePython2Test {
public void testBasic() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(386);
StringBuilder grammarBuilder = new StringBuilder(511);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def visitTerminal(self, node):\n");
grammarBuilder.append(" print(node.symbol.text)\n");
@ -106,12 +116,17 @@ public class TestListeners extends BasePython2Test {
public void testTokenGetters_2() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(535);
StringBuilder grammarBuilder = new StringBuilder(660);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitA(self, ctx):\n");
grammarBuilder.append(" if ctx.getChildCount()==2:\n");
@ -154,12 +169,17 @@ public class TestListeners extends BasePython2Test {
public void testLRWithLabels() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(527);
StringBuilder grammarBuilder = new StringBuilder(652);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitCall(self, ctx):\n");
grammarBuilder.append(" print(ctx.e().start.text + ' ' + str(ctx.eList()))\n");
@ -205,12 +225,17 @@ public class TestListeners extends BasePython2Test {
public void testRuleGetters_1() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(572);
StringBuilder grammarBuilder = new StringBuilder(697);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitA(self, ctx):\n");
grammarBuilder.append(" if ctx.getChildCount()==2:\n");
@ -254,12 +279,17 @@ public class TestListeners extends BasePython2Test {
public void testLR() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(547);
StringBuilder grammarBuilder = new StringBuilder(672);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitE(self, ctx):\n");
grammarBuilder.append(" if ctx.getChildCount()==3:\n");
@ -307,12 +337,17 @@ public class TestListeners extends BasePython2Test {
public void testRuleGetters_2() throws Exception {
mkdir(tmpdir);
StringBuilder grammarBuilder = new StringBuilder(572);
StringBuilder grammarBuilder = new StringBuilder(697);
grammarBuilder.append("grammar T;\n");
grammarBuilder.append("@parser::header {\n");
grammarBuilder.append("}\n");
grammarBuilder.append("\n");
grammarBuilder.append("@parser::members {\n");
grammarBuilder.append("if __name__ is not None and \".\" in __name__:\n");
grammarBuilder.append(" from .TListener import TListener\n");
grammarBuilder.append("else:\n");
grammarBuilder.append(" from TListener import TListener\n");
grammarBuilder.append("\n");
grammarBuilder.append("class LeafListener(TListener):\n");
grammarBuilder.append(" def exitA(self, ctx):\n");
grammarBuilder.append(" if ctx.getChildCount()==2:\n");