| /* Test Infrastructure */ |
| |
| function loadFile(fileName, encoding) { |
| var f = new java.io.File(fileName), |
| size = f.length(), |
| isr, |
| fis = new java.io.FileInputStream(f); |
| if (encoding) { |
| isr = new java.io.InputStreamReader(fis, encoding); |
| } else { |
| isr = new java.io.InputStreamReader(fis); |
| } |
| |
| /* Should use the ternary version of isr.read here, but can't figure |
| * out how to create a Java char array from JS. . . |
| * @todo |
| */ |
| var charCode, data=[]; |
| while ((charCode = isr.read()) >= 0) { |
| data.push(String.fromCharCode(charCode)); |
| } |
| return data.join(""); |
| } |
| |
| eval(loadFile("../../lib/antlr3-all.js")); |
| eval(loadFile("../../lib/antlr3-cli.js")); |
| eval(loadFile("PythonLexer.js")); |
| eval(loadFile("PythonParser.js")); |
| eval(loadFile("rhino-python.extensions")); |
| |
| /* Parser Extensions */ |
| |
| var output = []; |
| function xlog(msg) { |
| output.push(msg); |
| } |
| |
| function MyLexer() { |
| MyLexer.superclass.constructor.apply(this, arguments); |
| } |
| ANTLR.lang.extend(MyLexer, PythonLexer, { |
| nextToken: function() { |
| // keep track of this token's position in line because Python is |
| // whitespace sensitive |
| this.startPos = this.getCharPositionInLine(); |
| return MyLexer.superclass.nextToken.call(this); |
| } |
| }); |
| MyLexer.prototype.emitErrorMessage = function(msg) {xlog(msg);} |
| PythonParser.prototype.emitErrorMessage = function(msg) {xlog(msg);} |
| |
| /* Test */ |
| |
| function parse(text) { |
| try { |
| var input = new ANTLR.runtime.ANTLRStringStream(text); |
| var lexer = new MyLexer(input); |
| var tokens = new ANTLR.runtime.CommonTokenStream(lexer); |
| tokens.discardOffChannelTokens=true; |
| var indentedSource = new PythonTokenSource(tokens); |
| tokens = new ANTLR.runtime.CommonTokenStream(indentedSource); |
| var parser = new PythonParser(tokens); |
| parser.file_input(); |
| } catch (e) { |
| xlog(e.toString()); |
| } finally { |
| } |
| } |
| |
| var input = loadFile("rhino-python.input"); |
| var expected = loadFile("rhino-python.output"); |
| parse(input); |
| var actual = output.join("\n")+"\n"; |
| if (actual==expected) { |
| print("Test Passed!"); |
| } else { |
| print("Test Failed!"); |
| print(actual); |
| print(expected); |
| } |