<!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>
