<!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>t047treeparser</title>

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

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

<!-- Test Code -->
<script type="text/javascript">
    var TLexer = function() {
        TLexer.superclass.constructor.apply(this, arguments);
    };
    org.antlr.lang.extend(TLexer, t047treeparserLexer, {
        reportError: function(re) {
            throw re;
        }
    });

    var TParser = function() {
        TParser.superclass.constructor.apply(this, arguments);
    };
    org.antlr.lang.extend(TParser, t047treeparserParser, {
        recover: function(re) {
        throw new PrivateError(re);
        }
    });

    var TWalker = function() {
        TWalker.superclass.constructor.apply(this, arguments);
        this.traces = [];
    };
    org.antlr.lang.extend(TWalker, t047treeparserWalker, {
        recover: function(re) {
            throw new PrivateError(re);
        },
        traceIn: function(ruleName, ruleIndex) {
            this.traces.push(">"+ruleName);
        },
        traceOut: function(ruleName, ruleIndex) {
            this.traces.push("<"+ruleName);
        }
    });

    function testWalker() {
        var xinput = [
                        "char c;",
                        "int x;",
                        "",
                        "void bar(int x);",
                        "",
                        "int foo(int y, char d) {",
                        "  int i;",
                        "  for (i=0; i<3; i=i+1) {",
                        "    x=3;",
                        "    y=5;",
                        "  }",
                        "}"
                     ].join("\n"),
            xoutput = "(VAR_DEF char c) (VAR_DEF int x) (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x))) (FUNC_DEF (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d)) (BLOCK (VAR_DEF int i) (for (= i 0) (< i 3) (= i (+ i 1)) (BLOCK (= x 3) (= y 5)))))",
            traces = [
              '>program', '>declaration', '>variable', '>type', '<type',
              '>declarator', '<declarator', '<variable', '<declaration',
              '>declaration', '>variable', '>type', '<type', '>declarator',
              '<declarator', '<variable', '<declaration', '>declaration',
              '>functionHeader', '>type', '<type', '>formalParameter',
              '>type', '<type', '>declarator', '<declarator',
              '<formalParameter', '<functionHeader', '<declaration',
              '>declaration', '>functionHeader', '>type', '<type',
              '>formalParameter', '>type', '<type', '>declarator',
              '<declarator', '<formalParameter', '>formalParameter', '>type',
              '<type', '>declarator', '<declarator', '<formalParameter',
              '<functionHeader', '>block', '>variable', '>type', '<type',
              '>declarator', '<declarator', '<variable', '>stat', '>forStat',
              '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr',
              '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom',
              '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom',
              '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr',
              '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr',
              '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom',
              '<expr', '<expr', '<stat', '<block', '<forStat', '<stat',
              '<block', '<declaration', '<program'
            ];


        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new TLexer(cstream),
            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
            parser = new TParser(tstream);
        var r = parser.program();

        assertEquals(r.getTree().toStringTree(), xoutput);

        var nodes = new org.antlr.runtime.tree.CommonTreeNodeStream(r.getTree());
        nodes.setTokenStream(tstream);
        var walker = new TWalker(nodes);
        walker.program();

        assertArrayEquals(walker.traces, traces);
    }

    function testRuleLabelPropertyRefText() {
        var cstream = new org.antlr.runtime.ANTLRStringStream("\nchar c;\n"),
            lexer = new TLexer(cstream),
            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
            parser = new TParser(tstream),
            r = parser.variable();

        var nodes = new org.antlr.runtime.tree.CommonTreeNodeStream(r.getTree());
        nodes.setTokenStream(tstream);
        var walker = new TWalker(nodes);
        r = walker.variable();

        assertEquals(r, 'c');
    }
</script>

</head>
<body>
    <h1>t047treeparser</h1>
</body>
</html>
