1 31 package org.jruby.parser; 32 33 import java.io.Reader ; 34 import java.io.StringReader ; 35 36 import org.jruby.Ruby; 37 import org.jruby.RubyFile; 38 import org.jruby.ast.Node; 39 import org.jruby.lexer.yacc.LexerSource; 40 import org.jruby.lexer.yacc.SyntaxException; 41 import org.jruby.runtime.DynamicScope; 42 import org.jruby.runtime.ThreadContext; 43 import org.jruby.util.collections.SinglyLinkedList; 44 45 48 public class Parser { 49 private final Ruby runtime; 50 51 public Parser(Ruby runtime) { 52 this.runtime = runtime; 53 } 54 55 public Node parse(String file, String content, DynamicScope blockScope) { 56 return parse(file, new StringReader (content), blockScope); 57 } 58 59 public Node parse(String file, Reader content, DynamicScope blockScope) { 60 RubyParserConfiguration configuration = new RubyParserConfiguration(); 61 SinglyLinkedList cref = runtime.getObject().getCRef(); 62 ThreadContext tc = runtime.getCurrentContext(); 63 64 if (blockScope != null) { 68 configuration.parseAsBlock(blockScope); 69 } 70 71 DefaultRubyParser parser = null; 72 RubyParserResult result = null; 73 try { 74 parser = RubyParserPool.getInstance().borrowParser(); 75 parser.setWarnings(runtime.getWarnings()); 76 tc.setCRef(cref); 77 LexerSource lexerSource = LexerSource.getSource(file, content); 78 result = parser.parse(configuration, lexerSource); 79 if (result.isEndSeen()) { 80 org.jruby.runtime.builtin.IRubyObject verbose = runtime.getVerbose(); 81 runtime.setVerbose(runtime.getNil()); 82 runtime.defineGlobalConstant("DATA", new RubyFile(runtime, file, content)); 83 runtime.setVerbose(verbose); 84 result.setEndSeen(false); 85 } 86 } catch (SyntaxException e) { 87 StringBuffer buffer = new StringBuffer (100); 88 buffer.append(e.getPosition().getFile()).append(':'); 89 buffer.append(e.getPosition().getEndLine()).append(": "); 90 buffer.append(e.getMessage()); 91 throw runtime.newSyntaxError(buffer.toString()); 92 } finally { 93 RubyParserPool.getInstance().returnParser(parser); 94 tc.unsetCRef(); 95 } 96 97 if (result.getScope() != null) { 103 result.getScope().growIfNeeded(); 104 } 105 106 result.addAppendBeginAndEndNodes(); 108 return result.getAST(); 109 } 110 } 111 | Popular Tags |