<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>t053hetero</title>

<!-- ANTLR includes -->
<script type="text/javascript" src="../../lib/antlr3-all.js"></script>

<script type="text/javascript" src="t053heteroT1Lexer.js"></script>
<script type="text/javascript" src="t053heteroT1Parser.js"></script>

<script type="text/javascript" src="t053heteroT2Lexer.js"></script>
<script type="text/javascript" src="t053heteroT2Parser.js"></script>

<script type="text/javascript" src="t053heteroT3Lexer.js"></script>
<script type="text/javascript" src="t053heteroT3Parser.js"></script>

<script type="text/javascript" src="t053heteroT4Lexer.js"></script>
<script type="text/javascript" src="t053heteroT4Parser.js"></script>

<script type="text/javascript" src="t053heteroT5Lexer.js"></script>
<script type="text/javascript" src="t053heteroT5Parser.js"></script>

<script type="text/javascript" src="t053heteroT6Lexer.js"></script>
<script type="text/javascript" src="t053heteroT6Parser.js"></script>

<script type="text/javascript" src="t053heteroT7Lexer.js"></script>
<script type="text/javascript" src="t053heteroT7Parser.js"></script>

<script type="text/javascript" src="t053heteroT8Lexer.js"></script>
<script type="text/javascript" src="t053heteroT8Parser.js"></script>

<script type="text/javascript" src="t053heteroT9Lexer.js"></script>
<script type="text/javascript" src="t053heteroT9Parser.js"></script>

<script type="text/javascript" src="t053heteroT10Lexer.js"></script>
<script type="text/javascript" src="t053heteroT10Parser.js"></script>

<script type="text/javascript" src="t053heteroT11Lexer.js"></script>
<script type="text/javascript" src="t053heteroT11Parser.js"></script>

<script type="text/javascript" src="t053heteroT12Lexer.js"></script>
<script type="text/javascript" src="t053heteroT12Parser.js"></script>

<script type="text/javascript" src="t053heteroT13Lexer.js"></script>
<script type="text/javascript" src="t053heteroT13Parser.js"></script>
<script type="text/javascript" src="t053heteroTP13Parser.js"></script>

<script type="text/javascript" src="t053heteroT14Lexer.js"></script>
<script type="text/javascript" src="t053heteroT14Parser.js"></script>
<script type="text/javascript" src="t053heteroTP14Parser.js"></script>

<script type="text/javascript" src="t053heteroT15Lexer.js"></script>
<script type="text/javascript" src="t053heteroT15Parser.js"></script>
<script type="text/javascript" src="t053heteroTP15Parser.js"></script>

<script type="text/javascript" src="t053heteroT16Lexer.js"></script>
<script type="text/javascript" src="t053heteroT16Parser.js"></script>
<script type="text/javascript" src="t053heteroTP16Parser.js"></script>

<script type="text/javascript" src="t053heteroT17Lexer.js"></script>
<script type="text/javascript" src="t053heteroT17Parser.js"></script>
<script type="text/javascript" src="t053heteroTP17Parser.js"></script>

<script type="text/javascript" src="t053heteroT18Lexer.js"></script>
<script type="text/javascript" src="t053heteroT18Parser.js"></script>
<script type="text/javascript" src="t053heteroTP18Parser.js"></script>

<script type="text/javascript" src="t053heteroT18Lexer.js"></script>
<script type="text/javascript" src="t053heteroT18Parser.js"></script>
<script type="text/javascript" src="t053heteroTP18Parser.js"></script>

<script type="text/javascript" src="t053heteroTLexer.js"></script>
<script type="text/javascript" src="t053heteroTParser.js"></script>
<script type="text/javascript" src="t053heteroTPParser.js"></script>

<!-- JsUnit include -->
<script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script>

<!-- Test Code -->
<script type="text/javascript">
    // Parser Tests

    function execParser(lexerCls, parserCls, grammarEntry, xinput) {
        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new (EnhancedParser(lexerCls))(cstream),
            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
            parser = new (EnhancedParser(parserCls))(tstream);
        var r = parser[grammarEntry]();

        if (r) {
            return r.getTree().toStringTree();
        }
        return "";
    }

    function execTreeParser(lexerCls, parserCls, grammarEntry, walkerCls, treeEntry, xinput)
    {
        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new (EnhancedParser(lexerCls))(cstream),
            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
            parser = new (EnhancedParser(parserCls))(tstream);
        var r = parser[grammarEntry]();

        var nodes = new org.antlr.runtime.tree.CommonTreeNodeStream(r.getTree());
        nodes.setTokenStream(tstream);
        var walker = new walkerCls(nodes);
        r = walker[treeEntry]();

        if (r) {
            return r.getTree().toStringTree();
        }
        return "";
    }


    function EnhancedParser(base) {
        var T = function() {
            T.superclass.constructor.apply(this, arguments);
            this.traces = [];
            this.buf = "";
        };

        org.antlr.lang.extend(T, base, {
            capture: function(t) {
                this.buf += t;
            },
            traceIn: function(ruleName, ruleIndex) {
                this.traces.push(">"+ruleName);
            },
            traceOut: function(ruleName, ruleIndex) {
                this.traces.push("<"+ruleName);
            },
            reportError: function(input, re) {
                throw re;
            }
        });

        return T;
    }

    // PARSERS -- AUTO AST

    function testToken() {
        var found = execParser(
                t053heteroT1Lexer,
                t053heteroT1Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testTokenWithLabel() {
        var found = execParser(
                t053heteroT2Lexer,
                t053heteroT2Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testTokenWithListLabel() {
        var found = execParser(
                t053heteroT3Lexer,
                t053heteroT3Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testTokenRoot() {
        var found = execParser(
                t053heteroT4Lexer,
                t053heteroT4Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testTokenRootWithListLabel() {
        var found = execParser(
                t053heteroT5Lexer,
                t053heteroT5Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testString() {
        var found = execParser(
                t053heteroT6Lexer,
                t053heteroT6Parser,
                "a",
                "begin");
        assertEquals("begin<V>", found);
    }

    function testStringRoot() {
        var found = execParser(
                t053heteroT7Lexer,
                t053heteroT7Parser,
                "a",
                "begin");
        assertEquals("begin<V>", found);
    }

    // PARSERS -- REWRITE AST

    function testRewriteToken() {
        var found = execParser(
                t053heteroT8Lexer,
                t053heteroT8Parser,
                "a",
                "a");
        assertEquals("a<V>", found);
    }

    function testrewritetokenwithargs() {
        var found = execParser(
                t053heteroT9Lexer,
                t053heteroT9Parser,
                "a",
                "a");
        assertEquals("<V>;421930 a<V>;9900", found);
    }

    function testRewriteTokenRoot() {
        var found = execParser(
                t053heteroT10Lexer,
                t053heteroT10Parser,
                "a",
                "a 2");
        assertEquals("(a<V> 2)", found);
    }

    function testRewriteString() {
        var found = execParser(
                t053heteroT11Lexer,
                t053heteroT11Parser,
                "a",
                "begin");
        assertEquals("begin<V>", found);
    }

    function testRewriteStringRoot() {
        var found = execParser(
                t053heteroT12Lexer,
                t053heteroT12Parser,
                "a",
                "begin 2");
        assertEquals("(begin<V> 2)", found);
    }

    // TREE PARSERS -- REWRITE AST

    function testTreeParserRewriteFlatList() {
        var found = execTreeParser(
                t053heteroT13Lexer,
                t053heteroT13Parser,
                "a",
                t053heteroTP13Parser,
                "a",
                "abc 34");
        assertEquals("34<V> abc<W>", found);
    }

    function testTreeParserRewriteTree() {
        var found = execTreeParser(
                t053heteroT14Lexer,
                t053heteroT14Parser,
                "a",
                t053heteroTP14Parser,
                "a",
                "abc 34");
        assertEquals("(34<V> abc<W>)", found);
    }

    function testTreeParserRewriteImaginary() {
        var found = execTreeParser(
                t053heteroT15Lexer,
                t053heteroT15Parser,
                "a",
                t053heteroTP15Parser,
                "a",
                "abc");
        assertEquals("ROOT<V> abc", found);
    }

    function testTreeParserRewriteImaginaryWithArgs() {
        var found = execTreeParser(
                t053heteroT16Lexer,
                t053heteroT16Parser,
                "a",
                t053heteroTP16Parser,
                "a",
                "abc");
        assertEquals("ROOT<V>;42 abc", found);
    }

    function testTreeParserRewriteImaginaryRoot() {
        var found = execTreeParser(
                t053heteroT17Lexer,
                t053heteroT17Parser,
                "a",
                t053heteroTP17Parser,
                "a",
                "abc");
        assertEquals("(ROOT<V> abc)", found);
    }

    function testTreeParserRewriteImaginaryFromReal() {
        var found = execTreeParser(
                t053heteroT18Lexer,
                t053heteroT18Parser,
                "a",
                t053heteroTP18Parser,
                "a",
                "abc");
        assertEquals("ROOT<V>@1", found);
    }

    function testTreeParserAutoHeteroAST() {
        var found = execTreeParser(
                t053heteroTLexer,
                t053heteroTParser,
                "a",
                t053heteroTPParser,
                "a",
                "abc;");
        assertEquals("abc<V> ;<V>", found);
    }
</script>

</head>
<body>
    <h1>t053hetero</h1>
</body>
</html>