Package st.gravel.support.compiler.ast

Source Code of st.gravel.support.compiler.ast.Parser$Parser_Factory

package st.gravel.support.compiler.ast;

/*
  This file is automatically generated from typed smalltalk source. Do not edit by hand.
  (C) AG5.com
*/

import java.math.BigInteger;
import st.gravel.support.jvm.NonLocalReturn;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.MethodNode;
import st.gravel.support.compiler.ast.SourceFile;
import st.gravel.support.compiler.ast.SequenceNode;
import st.gravel.support.compiler.ast.TypeNode;
import st.gravel.support.compiler.ast.ParseError;
import st.gravel.support.compiler.ast.ArrayLiteralNode;
import st.gravel.support.compiler.ast.LiteralNode;
import st.gravel.support.compiler.ast.AssignmentNode;
import st.gravel.support.compiler.ast.VariableNode;
import st.gravel.support.compiler.ast.BinaryMessageNode;
import st.gravel.support.compiler.ast.BinaryMethodNode;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.PragmaNode;
import st.gravel.support.compiler.ast.UnaryMessageNode;
import st.gravel.support.compiler.ast.BlockNode;
import st.gravel.support.compiler.ast.ByteArrayLiteralNode;
import st.gravel.support.compiler.ast.CharacterLiteralNode;
import st.gravel.support.compiler.ast.SymbolLiteralNode;
import java.util.List;
import java.util.ArrayList;
import st.gravel.support.compiler.ast.KeywordMessageNode;
import st.gravel.support.compiler.ast.KeywordMethodNode;
import st.gravel.support.compiler.ast.MessageNode;
import st.gravel.support.compiler.ast.CascadeNode;
import st.gravel.support.compiler.ast.NumberLiteralNode;
import st.gravel.support.compiler.ast.TypeCast;
import st.gravel.support.compiler.ast.IntegerLiteralNode;
import st.gravel.support.compiler.ast.FloatLiteralNode;
import st.gravel.support.compiler.ast.FixedPointLiteralNode;
import st.gravel.support.compiler.ast.DoubleLiteralNode;
import st.gravel.support.compiler.ast.ReferenceLiteralNode;
import st.gravel.support.compiler.ast.Statement;
import st.gravel.support.compiler.ast.ReturnNode;
import st.gravel.support.compiler.ast.StringLiteralNode;
import st.gravel.support.compiler.ast.NilLiteralNode;
import st.gravel.support.compiler.ast.BooleanLiteralNode;
import st.gravel.support.compiler.ast.BlockTypeNode;
import st.gravel.support.compiler.ast.NamespacedTypeVariableNode;
import st.gravel.support.compiler.ast.SelfTypeNode;
import st.gravel.support.compiler.ast.InstanceTypeNode;
import st.gravel.support.compiler.ast.TypeVariableNode;
import st.gravel.support.compiler.ast.GenericTypeVariableNode;
import st.gravel.support.compiler.ast.UnaryMethodNode;
import st.gravel.support.compiler.ast.NamespacedVariableNode;
import st.gravel.support.compiler.ast.Node;

public class Parser extends Object implements Cloneable {

  public static Parser_Factory factory = new Parser_Factory();

  SourceFile _sourceFile;

  java.nio.CharBuffer _stream;

  public static class Parser_Factory extends st.gravel.support.jvm.SmalltalkFactory {

    public Parser basicNew() {
      Parser newInstance = new Parser();
      newInstance.initialize();
      return newInstance;
    }

    public Expression parseExpression_(final String _aString) {
      final Parser _parser;
      final Expression _res;
      _parser = this.source_(_aString);
      _res = _parser.parseExpression();
      st.gravel.support.jvm.ObjectExtensions.assert_(this, _parser.atEnd());
      return _res;
    }

    public MethodNode parseMethod_(final String _aString) {
      final Parser _parser;
      final MethodNode _res;
      _parser = this.source_(_aString);
      _res = _parser.parseMethod();
      st.gravel.support.jvm.ObjectExtensions.assert_(this, _parser.atEnd());
      return _res;
    }

    public MethodNode parseMethod_sourceFile_(final String _aString, final SourceFile _sourceFile) {
      final Parser _parser;
      final MethodNode _res;
      _parser = this.source_sourceFile_(_aString, _sourceFile);
      _res = _parser.parseMethod();
      st.gravel.support.jvm.ObjectExtensions.assert_(this, _parser.atEnd());
      return _res;
    }

    public SequenceNode parseSequence_(final String _aString) {
      final Parser _parser;
      final SequenceNode _res;
      _parser = this.source_(_aString);
      _res = _parser.parseSequence();
      st.gravel.support.jvm.ObjectExtensions.assert_(this, _parser.atEnd());
      return _res;
    }

    public TypeNode parseTypeNode_(final String _aString) {
      final Parser _parser;
      final TypeNode _res;
      _parser = this.source_(_aString);
      _res = _parser.parseTypeNode();
      st.gravel.support.jvm.ObjectExtensions.assert_(this, _parser.atEnd());
      return _res;
    }

    public Parser source_(final String _aString) {
      return this.stream_sourceFile_(st.gravel.support.jvm.ReadStreamFactory.on_(_aString), null);
    }

    public Parser source_sourceFile_(final String _aString, final SourceFile _sourceFile) {
      return this.stream_sourceFile_(st.gravel.support.jvm.ReadStreamFactory.on_(_aString), _sourceFile);
    }

    public Parser stream_sourceFile_(final java.nio.CharBuffer _aReadStream, final SourceFile _sourceFile) {
      return this.basicNew().initializeStream_sourceFile_(_aReadStream, _sourceFile);
    }
  }

  static public Expression _parseExpression_(Object receiver, final String _aString) {
    return factory.parseExpression_(_aString);
  }

  static public MethodNode _parseMethod_(Object receiver, final String _aString) {
    return factory.parseMethod_(_aString);
  }

  static public MethodNode _parseMethod_sourceFile_(Object receiver, final String _aString, final SourceFile _sourceFile) {
    return factory.parseMethod_sourceFile_(_aString, _sourceFile);
  }

  static public SequenceNode _parseSequence_(Object receiver, final String _aString) {
    return factory.parseSequence_(_aString);
  }

  static public TypeNode _parseTypeNode_(Object receiver, final String _aString) {
    return factory.parseTypeNode_(_aString);
  }

  static public Parser _source_(Object receiver, final String _aString) {
    return factory.source_(_aString);
  }

  static public Parser _source_sourceFile_(Object receiver, final String _aString, final SourceFile _sourceFile) {
    return factory.source_sourceFile_(_aString, _sourceFile);
  }

  static public Parser _stream_sourceFile_(Object receiver, final java.nio.CharBuffer _aReadStream, final SourceFile _sourceFile) {
    return factory.stream_sourceFile_(_aReadStream, _sourceFile);
  }

  public boolean atEnd() {
    return st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream);
  }

  public Parser copy() {
    try {
      Parser _temp1 = (Parser) this.clone();
      _temp1.postCopy();
      return _temp1;
    } catch (CloneNotSupportedException e) {
      throw new RuntimeException(e);
    }
  }

  public int eatComment() {
    int _i;
    _i = 1;
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream);
      if (!_temp1) {
        final char _ch;
        _i = (_i + 1);
        _ch = st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
        if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '\"')) {
          if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '\"')) {
            _i = (_i + 1);
          } else {
            return _i;
          }
        }
      }
    }
    throw ParseError.factory.basicNew();
  }

  public int eatWhitespace() {
    int _i;
    _i = 0;
    boolean _temp1 = true;
    while (_temp1) {
      _temp1 = (!st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) && st.gravel.support.jvm.CharacterExtensions.isWhitespace(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream));
      if (_temp1) {
        st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
        _i = (_i + 1);
      }
    }
    if ((!st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) && st.gravel.support.jvm.CharacterExtensions.equals_(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream), '\"')) {
      _i = (_i + Parser.this.eatComment());
      _i = (_i + Parser.this.eatWhitespace());
    }
    return _i;
  }

  public Parser_Factory factory() {
    return factory;
  }

  public Parser initialize() {
    return this;
  }

  public Parser initializeStream_sourceFile_(final java.nio.CharBuffer _aReadStream, final SourceFile _aSourceFile) {
    _sourceFile = _aSourceFile;
    _stream = _aReadStream;
    this.initialize();
    return this;
  }

  public boolean isBinarySelectorChar_(final Character _ch) {
    if (_ch == null) {
      return false;
    }
    return st.gravel.support.jvm.ArrayExtensions.includes_(new char[] { '~', '@', '%', '&', '*', '-', '+', '=', '|', '\\', '<', '>', ',', '?', '/' }, _ch);
  }

  public boolean isLetter_(final char _ch) {
    return (_ch >= 'A' && _ch <= 'Z') || (_ch >= 'a' && _ch <= 'z');
  }

  public boolean isUnderscore_(final char _ch) {
    return st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '_');
  }

  public ArrayLiteralNode parseArray() {
    LiteralNode[] _elements;
    char _ch;
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    _elements = new LiteralNode[] {};
    this.eatWhitespace();
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ')');
      if (!_temp1) {
        _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
        if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '#')) {
          _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseHashedLiteral());
        } else {
          if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '(')) {
            _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseArray());
          } else {
            if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '\'')) {
              _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseString());
            } else {
              if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '$')) {
                _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseCharacter());
              } else {
                if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '-')) {
                  _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseNegativeNumber());
                } else {
                  if (_ch >= '0' && _ch <= '9') {
                    _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseNumber());
                  } else {
                    _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseSymbolNoHash());
                  }
                }
              }
            }
          }
        }
        Parser.this.eatWhitespace();
      }
    }
    return ArrayLiteralNode.factory.elements_(_elements);
  }

  public Expression parseAssignmentOrExpression() {
    final Expression _rec;
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    _rec = this.parseExpression();
    this.eatWhitespace();
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '='));
      return ((Expression) Parser.this.setSourcePosition_node_(_start, Parser.this.parseAssignment_(_rec)));
    }
    return ((Expression) this.setSourcePosition_node_(_start, _rec));
  }

  public AssignmentNode parseAssignment_(final Expression _aNode) {
    final Expression _value;
    st.gravel.support.jvm.ObjectExtensions.assert_(this, _aNode.isAssignable());
    _value = this.parseAssignmentOrExpression();
    return AssignmentNode.factory.variable_value_(((VariableNode) _aNode), _value);
  }

  public Parser parseBang() {
    this.eatWhitespace();
    st.gravel.support.jvm.ObjectExtensions.assert_(this, st.gravel.support.jvm.CharacterExtensions.equals_(st.gravel.support.jvm.ReadStreamExtensions.next(_stream), '!'));
    this.eatWhitespace();
    return this;
  }

  public Expression parseBinaryMessageChain_receiver_(final String _aString, final Expression _rec) {
    final Expression _arg;
    final BinaryMessageNode _receiver;
    this.eatWhitespace();
    _arg = this.parseUnaryMessage();
    this.eatWhitespace();
    _receiver = BinaryMessageNode.factory.receiver_selector_argument_(_rec, _aString, _arg);
    return this.parseBinaryOrUnaryMessage_(_receiver);
  }

  public String parseBinaryMessageSelector() {
    Character _ch;
    final StringBuilder _str;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (!this.isBinarySelectorChar_(_ch)) {
      return null;
    }
    _str = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    boolean _temp1 = true;
    while (_temp1) {
      _str.append(st.gravel.support.jvm.ReadStreamExtensions.next(_stream));
      _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
      _temp1 = Parser.this.isBinarySelectorChar_(_ch);
    }
    return _str.toString();
  }

  public BinaryMethodNode parseBinaryMethod_(final String _aString) {
    final VariableDeclarationNode _argument;
    final SequenceNode _body;
    final TypeNode _returnType;
    final PragmaNode[][] _pragmas;
    _pragmas = new PragmaNode[1][];
    this.eatWhitespace();
    _argument = this.parseVariableDeclaration();
    _returnType = this.parseReturnType();
    _pragmas[0] = this.readPragmas();
    _body = this.parseSequenceNode_(new st.gravel.support.jvm.Block1<Object, PragmaNode[]>() {

      @Override
      public Object value_(final PragmaNode[] _extraPragmas) {
        return _pragmas[0] = st.gravel.support.jvm.ArrayExtensions.copyWithAll_(_pragmas[0], _extraPragmas);
      }
    });
    return BinaryMethodNode.factory.selector_argument_body_returnType_pragmas_protocol_(_aString, _argument, _body, _returnType, _pragmas[0], null);
  }

  public Expression parseBinaryOrUnaryMessage() {
    final Expression _receiver;
    _receiver = this.parseOperand();
    return this.parseBinaryOrUnaryMessage_(_receiver);
  }

  public Expression parseBinaryOrUnaryMessage_(final Expression _receiver) {
    String _res;
    this.eatWhitespace();
    _res = this.parseIdentifier();
    if (_res != null) {
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
        st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, (-1 - _res.length()));
        return _receiver;
      } else {
        return Parser.this.parseBinaryOrUnaryMessage_(UnaryMessageNode.factory.receiver_selector_(_receiver, _res));
      }
    }
    _res = this.parseBinaryMessageSelector();
    if (_res != null) {
      return Parser.this.parseBinaryMessageChain_receiver_(_res, _receiver);
    }
    return _receiver;
  }

  public BlockNode parseBlock() {
    VariableDeclarationNode[] _arguments;
    final BlockNode _bn;
    TypeNode _returnType;
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    this.eatWhitespace();
    _arguments = new VariableDeclarationNode[] {};
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
      boolean _temp1 = true;
      while (_temp1) {
        Parser.this.eatWhitespace();
        _arguments = st.gravel.support.jvm.ArrayExtensions.copyWith_(_arguments, Parser.this.parseVariableDeclaration());
        Parser.this.eatWhitespace();
        _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':');
      }
      _returnType = Parser.this.parseReturnType();
      Parser.this.eatWhitespace();
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ']')) {
        return BlockNode.factory.arguments_body_returnType_(_arguments, SequenceNode.factory.empty(), _returnType);
      }
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '|'));
    } else {
      _returnType = Parser.this.parseReturnType();
      if (_returnType != null) {
        Parser.this.eatWhitespace();
        st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '|'));
      }
    }
    _bn = BlockNode.factory.arguments_body_returnType_(_arguments, this.parseSequenceNode_(new st.gravel.support.jvm.Block1<Object, PragmaNode[]>() {

      @Override
      public Object value_(final PragmaNode[] _extraPragmas) {
        throw new RuntimeException("Extra pragmas not allowed");
      }
    }), _returnType);
    st.gravel.support.jvm.ObjectExtensions.assert_(this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ']'));
    return ((BlockNode) this.setSourcePosition_node_(_start, _bn));
  }

  public ByteArrayLiteralNode parseByteArray() {
    byte[] _bytes;
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    this.eatWhitespace();
    _bytes = new byte[] {};
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ']');
      if (!_temp1) {
        _bytes = st.gravel.support.jvm.ByteArrayExtensions.copyWith_(_bytes, st.gravel.support.jvm.IntegerExtensions.asInt(Parser.this.readInteger()));
        Parser.this.eatWhitespace();
      }
    }
    return ByteArrayLiteralNode.factory.value_(_bytes);
  }

  public CharacterLiteralNode parseCharacter() {
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    return CharacterLiteralNode.factory.value_(st.gravel.support.jvm.ReadStreamExtensions.next(_stream));
  }

  public Expression parseExpression() {
    final Expression _receiver;
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    this.eatWhitespace();
    _receiver = this.parseOperand();
    return ((Expression) this.setSourcePosition_node_(_start, this.parseMessageChain_(((Expression) this.setSourcePosition_node_(_start, _receiver)))));
  }

  public LiteralNode parseHashedLiteral() {
    final char _ch;
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (this.isLetter_(_ch)) {
      return Parser.this.parseSymbolNoHash_(Parser.this.parseIdentifier());
    }
    return this.parseHashedLiteralNoHash();
  }

  public LiteralNode parseHashedLiteralNoHash() {
    final Character _ch;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '(')) {
      return Parser.this.parseArray();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '\'')) {
      return SymbolLiteralNode.factory.value_(st.gravel.core.Symbol.value(Parser.this.readString()));
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '[')) {
      return Parser.this.parseByteArray();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '{')) {
      return Parser.this.parseReference();
    }
    if (this.isBinarySelectorChar_(_ch)) {
      return SymbolLiteralNode.factory.value_(st.gravel.core.Symbol.value(Parser.this.parseBinaryMessageSelector()));
    }
    return this.parseSymbolNoHash();
  }

  public String parseIdentifier() {
    Character _ch;
    final StringBuilder _wStr;
    Character _temp1 = this.peekLetter();
    _ch = _temp1 == null ? this.peekUnderscore() : _temp1;
    if (_ch == null) {
      return null;
    }
    _wStr = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    _wStr.append(_ch);
    _ch = this.peekLetterDigitOrUnderscore();
    boolean _temp2 = false;
    while (!_temp2) {
      _temp2 = _ch == null;
      if (!_temp2) {
        _wStr.append(_ch);
        _ch = Parser.this.peekLetterDigitOrUnderscore();
      }
    }
    return _wStr.toString();
  }

  public String parseKeywordIdentifier() {
    final String _res;
    _res = this.parseIdentifier();
    if (_res == null) {
      return null;
    }
    if (!st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
      st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, (0 - _res.length()));
      return null;
    }
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '=')) {
      st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, (-2 - _res.length()));
      return null;
    }
    return _res + ':';
  }

  public Expression parseKeywordMessageChain_receiver_(final String _aString, final Expression _receiver) {
    String _res;
    final StringBuilder _str;
    final List<Expression> _arguments;
    _str = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    _str.append(_aString);
    _str.append(':');
    _arguments = new java.util.ArrayList();
    this.eatWhitespace();
    _arguments.add(this.parseBinaryOrUnaryMessage());
    this.eatWhitespace();
    _res = this.parseIdentifier();
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = _res == null;
      if (!_temp1) {
        st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':'));
        _str.append(_res);
        _str.append(':');
        Parser.this.eatWhitespace();
        _arguments.add(Parser.this.parseBinaryOrUnaryMessage());
        Parser.this.eatWhitespace();
        _res = Parser.this.parseIdentifier();
      }
    }
    return KeywordMessageNode.factory.receiver_selector_arguments_(_receiver, _str.toString(), _arguments.toArray(new Expression[_arguments.size()]));
  }

  public KeywordMethodNode parseKeywordMethod_(final String _aString) {
    String _res;
    final StringBuilder _str;
    final List<VariableDeclarationNode> _arguments;
    final SequenceNode _body;
    final TypeNode _returnType;
    final PragmaNode[][] _pragmas;
    _pragmas = new PragmaNode[1][];
    _str = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    _str.append(_aString);
    _str.append(':');
    _arguments = new java.util.ArrayList();
    this.eatWhitespace();
    _arguments.add(this.parseVariableDeclaration());
    this.eatWhitespace();
    _res = this.parseKeywordIdentifier();
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = _res == null;
      if (!_temp1) {
        _str.append(_res);
        Parser.this.eatWhitespace();
        _arguments.add(Parser.this.parseVariableDeclaration());
        Parser.this.eatWhitespace();
        _res = Parser.this.parseKeywordIdentifier();
      }
    }
    _returnType = this.parseReturnType();
    _pragmas[0] = this.readPragmas();
    _body = this.parseSequenceNode_(new st.gravel.support.jvm.Block1<Object, PragmaNode[]>() {

      @Override
      public Object value_(final PragmaNode[] _extraPragmas) {
        return _pragmas[0] = st.gravel.support.jvm.ArrayExtensions.copyWithAll_(_pragmas[0], _extraPragmas);
      }
    });
    return KeywordMethodNode.factory.selector_arguments_body_returnType_pragmas_protocol_(_str.toString(), _arguments.toArray(new VariableDeclarationNode[_arguments.size()]), _body, _returnType, _pragmas[0], null);
  }

  public Expression parseMessageChain_(final Expression _receiver) {
    final Expression _exp;
    List<MessageNode> _messages;
    _exp = this.parseNoCascadeMessageChain_(_receiver);
    this.eatWhitespace();
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ';')) {
      final MessageNode _baseMsg;
      _messages = new java.util.ArrayList();
      _baseMsg = ((MessageNode) _exp);
      _messages.add(_baseMsg);
      boolean _temp1 = true;
      while (_temp1) {
        final MessageNode _msg;
        _msg = ((MessageNode) Parser.this.parseNoCascadeMessageChain_(_baseMsg.receiver()));
        _messages.add(_msg);
        _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ';');
      }
      return CascadeNode.factory.messages_(_messages.toArray(new MessageNode[_messages.size()]));
    }
    return _exp;
  }

  public MethodNode parseMethod() {
    String _res;
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    this.eatWhitespace();
    _res = this.parseIdentifier();
    if (_res != null) {
      return ((MethodNode) Parser.this.setSourcePosition_node_(_start, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':') ? Parser.this.parseKeywordMethod_(_res) : Parser.this.parseUnaryMethod_(_res)));
    }
    _res = this.parseBinaryMessageSelector();
    if (_res != null) {
      return ((MethodNode) Parser.this.setSourcePosition_node_(_start, Parser.this.parseBinaryMethod_(_res)));
    }
    return null;
  }

  public NumberLiteralNode parseNegativeNumber() {
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    if (!st.gravel.support.jvm.CharacterExtensions.isDigit(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream))) {
      st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, -1);
      return null;
    }
    return this.parseNumber().negated();
  }

  public Expression parseNestedExpression() {
    Expression _exp;
    final int _start;
    final TypeNode _typeCast;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    this.eatWhitespace();
    _typeCast = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '{') ? this.parseTypeExpressionAndClose() : null;
    _exp = this.parseAssignmentOrExpression();
    if (_typeCast != null) {
      _exp = TypeCast.factory.type_expression_(_typeCast, _exp);
    }
    this.eatWhitespace();
    st.gravel.support.jvm.ObjectExtensions.assert_(this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ')'));
    return ((Expression) this.setSourcePosition_node_(_start, _exp));
  }

  public Expression parseNoCascadeMessageChain_(final Expression _receiver) {
    String _res;
    this.eatWhitespace();
    _res = this.parseIdentifier();
    if (_res != null) {
      return st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':') ? Parser.this.parseKeywordMessageChain_receiver_(_res, _receiver) : Parser.this.parseNoCascadeMessageChain_(UnaryMessageNode.factory.receiver_selector_(_receiver, _res));
    }
    _res = this.parseBinaryMessageSelector();
    if (_res != null) {
      return Parser.this.parseNoCascadeMessageChain_(Parser.this.parseBinaryMessageChain_receiver_(_res, _receiver));
    }
    return _receiver;
  }

  public NumberLiteralNode parseNumber() {
    final java.math.BigInteger _value;
    String _fractionString;
    _value = this.readInteger_(10);
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, 'r')) {
      return IntegerLiteralNode.factory.integer_(Parser.this.readInteger_(st.gravel.support.jvm.IntegerExtensions.asInt(_value)));
    }
    _fractionString = null;
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.')) {
      _fractionString = Parser.this.readDigits();
      if (_fractionString.length() == 0) {
        st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, -1);
        return IntegerLiteralNode.factory.integer_(_value);
      }
    }
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, 'e')) {
      final int _exSign;
      final java.math.BigInteger _exponent;
      _exSign = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '-') ? -1 : 1;
      _exponent = st.gravel.support.jvm.LargeIntegerExtensions.multiply_(Parser.this.readInteger_(10), _exSign);
      return FloatLiteralNode.factory.integer_fractionString_exponent_(_value, _fractionString, _exponent);
    } else {
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, 's')) {
        int _scale;
        _scale = st.gravel.support.jvm.IntegerExtensions.asInt(Parser.this.readInteger_(10));
        if (_fractionString == null) {
          _fractionString = "";
        }
        _scale = java.lang.Math.max(_scale, _fractionString.length());
        return FixedPointLiteralNode.factory.integer_fractionString_scale_(_value, _fractionString, _scale);
      } else {
        if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, 'd')) {
          final int _exSign;
          final java.math.BigInteger _exponent;
          _exSign = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '-') ? -1 : 1;
          _exponent = st.gravel.support.jvm.LargeIntegerExtensions.multiply_(Parser.this.readInteger_(10), _exSign);
          return DoubleLiteralNode.factory.integer_fractionString_exponent_(_value, _fractionString, _exponent);
        }
      }
    }
    return _fractionString == null ? IntegerLiteralNode.factory.integer_(_value) : FloatLiteralNode.factory.integer_fractionString_exponent_(_value, _fractionString, null);
  }

  public Expression parseOperand() {
    final Character _ch;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (st.gravel.support.jvm.CharacterExtensions.isDigit(_ch)) {
      return Parser.this.parseNumber();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '-')) {
      return Parser.this.parseNegativeNumber();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '$')) {
      return Parser.this.parseCharacter();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '\'')) {
      return Parser.this.parseString();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '#')) {
      return Parser.this.parseHashedLiteral();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '[')) {
      return Parser.this.parseBlock();
    }
    if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '(')) {
      return Parser.this.parseNestedExpression();
    }
    return this.parseVariable();
  }

  public ReferenceLiteralNode parseReference() {
    String[] _elements;
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    _elements = new String[] {};
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '}');
      if (!_temp1) {
        _elements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_elements, Parser.this.parseIdentifier());
        st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.');
      }
    }
    return ReferenceLiteralNode.factory.path_(_elements);
  }

  public TypeNode parseReturnType() {
    this.eatWhitespace();
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '{')) {
      Parser.this.eatWhitespace();
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '^'));
      return Parser.this.parseTypeExpressionAndClose();
    }
    return null;
  }

  public SequenceNode parseSequence() {
    return this.parseSequenceNode_(new st.gravel.support.jvm.Block1<Object, PragmaNode[]>() {

      @Override
      public Object value_(final PragmaNode[] _pragmas) {
        return Parser.this;
      }
    });
  }

  public SequenceNode parseSequenceNode_(final st.gravel.support.jvm.Block1<Object, PragmaNode[]> _extraPragmaBlock) {
    VariableDeclarationNode[] _temporaries;
    Statement[] _statements;
    Statement _statement;
    final int _start;
    final PragmaNode[] _pragmas;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    this.eatWhitespace();
    _temporaries = new VariableDeclarationNode[] {};
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '|')) {
      Parser.this.eatWhitespace();
      boolean _temp1 = false;
      while (!_temp1) {
        _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '|');
        if (!_temp1) {
          Parser.this.eatWhitespace();
          _temporaries = st.gravel.support.jvm.ArrayExtensions.copyWith_(_temporaries, Parser.this.parseVariableDeclaration());
          Parser.this.eatWhitespace();
        }
      }
    }
    _pragmas = this.readPragmas();
    if (_pragmas.length != 0) {
      _extraPragmaBlock.value_(_pragmas);
    }
    _statements = new Statement[] {};
    _statement = this.parseStatement();
    this.eatWhitespace();
    boolean _temp2 = false;
    while (!_temp2) {
      _temp2 = _statement == null;
      if (!_temp2) {
        _statements = st.gravel.support.jvm.ArrayExtensions.copyWith_(_statements, _statement);
        st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.');
        _statement = Parser.this.parseStatement();
        Parser.this.eatWhitespace();
      }
    }
    return ((SequenceNode) this.setSourcePosition_node_(_start, SequenceNode.factory.temporaries_statements_(_temporaries, _statements)));
  }

  public Statement parseStatement() {
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    this.eatWhitespace();
    if (st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) {
      return null;
    }
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '^')) {
      return ((Statement) Parser.this.setSourcePosition_node_(_start, ReturnNode.factory.value_(Parser.this.parseAssignmentOrExpression())));
    }
    return ((Statement) this.setSourcePosition_node_(_start, this.parseAssignmentOrExpression()));
  }

  public StringLiteralNode parseString() {
    return StringLiteralNode.factory.value_(this.readString());
  }

  public LiteralNode parseSymbolNoHash() {
    final String _id;
    _id = this.parseIdentifier();
    if (st.gravel.support.jvm.StringExtensions.equals_(_id, "nil")) {
      return NilLiteralNode.factory.basicNew();
    }
    if (st.gravel.support.jvm.StringExtensions.equals_(_id, "true")) {
      return BooleanLiteralNode.factory.value_(true);
    }
    if (st.gravel.support.jvm.StringExtensions.equals_(_id, "false")) {
      return BooleanLiteralNode.factory.value_(false);
    }
    if (_id == null) {
      final String _bin;
      _bin = Parser.this.parseBinaryMessageSelector();
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, _bin != null);
      return SymbolLiteralNode.factory.value_(st.gravel.core.Symbol.value(_bin));
    }
    return this.parseSymbolNoHash_(_id);
  }

  public SymbolLiteralNode parseSymbolNoHash_(final String _start) {
    String _id;
    String _t;
    _id = _start;
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
      _id = _id + ':';
      boolean _temp1 = true;
      while (_temp1) {
        _t = Parser.this.parseKeywordIdentifier();
        if (_t != null) {
          _id = _id + _t;
        }
        _temp1 = _t != null;
      }
    }
    return SymbolLiteralNode.factory.value_(st.gravel.core.Symbol.value(_id));
  }

  public TypeNode parseTypeExpressionAndClose() {
    final TypeNode _exp;
    _exp = this.parseTypeNode();
    st.gravel.support.jvm.ObjectExtensions.assert_(this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '}'));
    return _exp;
  }

  public BlockTypeNode parseTypeExpressionBlockAndClose() {
    TypeNode[] _args;
    TypeNode _returnType;
    _args = new TypeNode[] {};
    _returnType = null;
    boolean _temp1 = true;
    while (_temp1) {
      Parser.this.eatWhitespace();
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '^')) {
        _returnType = Parser.this.parseTypeNode();
      } else {
        _args = st.gravel.support.jvm.ArrayExtensions.copyWith_(_args, Parser.this.parseTypeNode());
      }
      Parser.this.eatWhitespace();
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ',');
    }
    st.gravel.support.jvm.ObjectExtensions.assert_(this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ']'));
    return BlockTypeNode.factory.arguments_returnType_(_args, _returnType);
  }

  public TypeNode[] parseTypeExpressionListAndClose() {
    final BlockTypeNode _block;
    _block = this.parseTypeExpressionBlockAndClose();
    st.gravel.support.jvm.ObjectExtensions.assert_(this, _block.returnType() == null);
    return _block.arguments();
  }

  public TypeNode parseTypeNode() {
    TypeNode _exp;
    _exp = this.parseTypeOperand();
    this.eatWhitespace();
    boolean _temp1 = true;
    while (_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '|');
      if (_temp1) {
        _exp = _exp.$pipe$(Parser.this.parseTypeOperand());
        Parser.this.eatWhitespace();
      }
    }
    return _exp;
  }

  public TypeNode parseTypeOperand() {
    final String _id;
    TypeNode _base;
    TypeNode[] _args;
    TypeNode _exp;
    this.eatWhitespace();
    _id = this.parseIdentifier();
    if (_id != null) {
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.')) {
        String[] _arr;
        _arr = st.gravel.support.jvm.ArrayFactory.with_with_(_id, Parser.this.parseIdentifier());
        boolean _temp1 = true;
        while (_temp1) {
          _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.');
          if (_temp1) {
            _arr = st.gravel.support.jvm.ArrayExtensions.copyWith_(_arr, Parser.this.parseIdentifier());
          }
        }
        _base = NamespacedTypeVariableNode.factory.path_(_arr);
      } else {
        if (st.gravel.support.jvm.StringExtensions.equals_(_id, "Self")) {
          _base = SelfTypeNode.factory.basicNew();
        } else {
          if (st.gravel.support.jvm.StringExtensions.equals_(_id, "Instance")) {
            _base = InstanceTypeNode.factory.basicNew();
          } else {
            _base = TypeVariableNode.factory.name_(_id);
          }
        }
      }
      Parser.this.eatWhitespace();
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '[')) {
        _args = Parser.this.parseTypeExpressionListAndClose();
        _exp = GenericTypeVariableNode.factory.root_arguments_(_base, _args);
      } else {
        _exp = _base;
      }
      Parser.this.eatWhitespace();
      if (st.gravel.support.jvm.CharacterExtensions.equals_(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream), 'd')) {
        final String _defString;
        _defString = st.gravel.support.jvm.ReadStreamExtensions.next_(_stream, 3);
        st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.StringExtensions.equals_(_defString, "def"));
        return _exp.asDefNode();
      } else {
        return _exp;
      }
    }
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '[')) {
      return Parser.this.parseTypeExpressionBlockAndClose();
    }
    throw ParseError.factory.basicNew();
  }

  public Expression parseUnaryMessage() {
    final Expression _receiver;
    _receiver = this.parseOperand();
    return this.parseUnaryMessage_(_receiver);
  }

  public Expression parseUnaryMessage_(final Expression _receiver) {
    final String _res;
    this.eatWhitespace();
    _res = this.parseIdentifier();
    if (_res != null) {
      if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
        st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, (-1 - _res.length()));
        return _receiver;
      } else {
        return Parser.this.parseUnaryMessage_(UnaryMessageNode.factory.receiver_selector_(_receiver, _res));
      }
    }
    return _receiver;
  }

  public MethodNode parseUnaryMethod_(final String _aString) {
    final SequenceNode _body;
    final TypeNode _returnType;
    final PragmaNode[][] _pragmas;
    _pragmas = new PragmaNode[1][];
    _returnType = this.parseReturnType();
    _pragmas[0] = this.readPragmas();
    _body = this.parseSequenceNode_(new st.gravel.support.jvm.Block1<Object, PragmaNode[]>() {

      @Override
      public Object value_(final PragmaNode[] _extraPragmas) {
        return _pragmas[0] = st.gravel.support.jvm.ArrayExtensions.copyWithAll_(_pragmas[0], _extraPragmas);
      }
    });
    return UnaryMethodNode.factory.selector_body_returnType_pragmas_protocol_(_aString, _body, _returnType, _pragmas[0], null);
  }

  public Expression parseVariable() {
    final String _name;
    _name = this.parseIdentifier();
    if (_name == null) {
      return null;
    }
    if (st.gravel.support.jvm.StringExtensions.equals_(_name, "nil")) {
      return NilLiteralNode.factory.basicNew();
    }
    if (st.gravel.support.jvm.StringExtensions.equals_(_name, "true")) {
      return BooleanLiteralNode.factory.value_(true);
    }
    if (st.gravel.support.jvm.StringExtensions.equals_(_name, "false")) {
      return BooleanLiteralNode.factory.value_(false);
    }
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.')) {
      String[] _path;
      if ((!st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) && new st.gravel.support.jvm.Predicate0() {

        @Override
        public boolean value() {
          final Character _ch;
          _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
          return Parser.this.isLetter_(_ch) || Parser.this.isUnderscore_(_ch);
        }
      }.value()) {
        _path = st.gravel.support.jvm.ArrayFactory.with_(_name);
        boolean _temp1 = true;
        while (_temp1) {
          final String _identifier;
          _identifier = Parser.this.parseIdentifier();
          if (_identifier != null) {
            _path = st.gravel.support.jvm.ArrayExtensions.copyWith_(_path, _identifier);
          }
          _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '.');
        }
        return NamespacedVariableNode.factory.path_(_path);
      } else {
        st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, -1);
      }
    }
    return VariableNode.factory.name_(_name);
  }

  public VariableDeclarationNode parseVariableDeclaration() {
    final String _varName;
    TypeNode _type;
    int _wsWidth;
    final int _start;
    _start = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    _varName = this.parseIdentifier();
    this.eatWhitespace();
    _type = null;
    if (st.gravel.support.jvm.CharacterExtensions.equals_(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream), '{')) {
      st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
      _wsWidth = Parser.this.eatWhitespace();
      if (st.gravel.support.jvm.CharacterExtensions.equals_(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream), '^')) {
        st.gravel.support.jvm.ReadStreamExtensions.skip_(_stream, (-1 - _wsWidth));
      } else {
        _type = Parser.this.parseTypeExpressionAndClose();
      }
    }
    return ((VariableDeclarationNode) this.setSourcePosition_node_(_start, VariableDeclarationNode.factory.name_type_(_varName, _type)));
  }

  public Character peekDigit() {
    final Character _ch;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (_ch == null) {
      return null;
    }
    if (_ch >= '0' && _ch <= '9') {
      return st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    }
    return null;
  }

  public Character peekLetter() {
    final Character _ch;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (_ch == null) {
      return null;
    }
    if (this.isLetter_(_ch)) {
      return st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    }
    return null;
  }

  public Character peekLetterDigitOrUnderscore() {
    final Character _letter;
    _letter = this.peekLetter();
    if (_letter != null) {
      return _letter;
    }
    Character _temp1 = this.peekDigit();
    return _temp1 == null ? this.peekUnderscore() : _temp1;
  }

  public Character peekUnderscore() {
    final Character _ch;
    _ch = st.gravel.support.jvm.ReadStreamExtensions.peek(_stream);
    if (_ch == null) {
      return null;
    }
    if (this.isUnderscore_(_ch)) {
      return st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    }
    return null;
  }

  public int position() {
    return st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
  }

  public Parser postCopy() {
    return this;
  }

  public String readDigits() {
    final StringBuilder _str;
    _str = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    boolean _temp1 = true;
    while (_temp1) {
      _temp1 = (!st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) && new st.gravel.support.jvm.Predicate0() {

        @Override
        public boolean value() {
          final int _v;
          _v = st.gravel.support.jvm.CharacterExtensions.digitValue(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream));
          return (_v >= 0) && (_v <= 10);
        }
      }.value();
      if (_temp1) {
        _str.append(st.gravel.support.jvm.ReadStreamExtensions.next(_stream));
      }
    }
    return _str.toString();
  }

  public java.math.BigInteger readInteger() {
    final java.math.BigInteger _value;
    _value = this.readInteger_(10);
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, 'r')) {
      return Parser.this.readInteger_(st.gravel.support.jvm.IntegerExtensions.asInt(_value));
    }
    return _value;
  }

  public java.math.BigInteger readInteger_(final int _base) {
    java.math.BigInteger _value;
    _value = ((java.math.BigInteger) java.math.BigInteger.ZERO);
    boolean _temp1 = true;
    while (_temp1) {
      _temp1 = (!st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream)) && new st.gravel.support.jvm.Predicate0() {

        @Override
        public boolean value() {
          final int _v;
          _v = st.gravel.support.jvm.CharacterExtensions.digitValue(st.gravel.support.jvm.ReadStreamExtensions.peek(_stream));
          return (_v >= 0) && (_v <= _base);
        }
      }.value();
      if (_temp1) {
        _value = st.gravel.support.jvm.LargeIntegerExtensions.plus_(st.gravel.support.jvm.LargeIntegerExtensions.multiply_(_value, _base), st.gravel.support.jvm.CharacterExtensions.digitValue(st.gravel.support.jvm.ReadStreamExtensions.next(_stream)));
      }
    }
    return _value;
  }

  public PragmaNode readPragma() {
    String _res;
    this.eatWhitespace();
    _res = this.parseIdentifier();
    st.gravel.support.jvm.ObjectExtensions.assert_(this, _res != null);
    if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':')) {
      String _sel;
      Expression[] _arguments;
      _sel = _res + ':';
      Parser.this.eatWhitespace();
      _arguments = st.gravel.support.jvm.ArrayFactory.with_(Parser.this.parseOperand());
      Parser.this.eatWhitespace();
      _res = Parser.this.parseIdentifier();
      boolean _temp1 = false;
      while (!_temp1) {
        _temp1 = _res == null;
        if (!_temp1) {
          st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, ':'));
          _sel = _sel + _res + ':';
          Parser.this.eatWhitespace();
          _arguments = st.gravel.support.jvm.ArrayExtensions.copyWith_(_arguments, Parser.this.parseOperand());
          Parser.this.eatWhitespace();
          _res = Parser.this.parseIdentifier();
        }
      }
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '>'));
      return PragmaNode.factory.expression_(KeywordMessageNode.factory.receiver_selector_arguments_(NilLiteralNode.factory.basicNew(), _sel, _arguments));
    } else {
      Parser.this.eatWhitespace();
      st.gravel.support.jvm.ObjectExtensions.assert_(Parser.this, st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '>'));
      return PragmaNode.factory.expression_(UnaryMessageNode.factory.receiver_selector_(NilLiteralNode.factory.basicNew(), _res));
    }
  }

  public PragmaNode[] readPragmas() {
    PragmaNode[] _pragmas;
    _pragmas = new PragmaNode[] {};
    this.eatWhitespace();
    boolean _temp1 = true;
    while (_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '<');
      if (_temp1) {
        _pragmas = st.gravel.support.jvm.ArrayExtensions.copyWith_(_pragmas, Parser.this.readPragma());
        Parser.this.eatWhitespace();
      }
    }
    return _pragmas;
  }

  public String readString() {
    final StringBuilder _str;
    _str = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
    st.gravel.support.jvm.ReadStreamExtensions.next(_stream);
    boolean _temp1 = false;
    while (!_temp1) {
      _temp1 = st.gravel.support.jvm.ReadStreamExtensions.atEnd(_stream);
      if (!_temp1) {
        if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '\'')) {
          if (st.gravel.support.jvm.ReadStreamExtensions.peekFor_(_stream, '\'')) {
            _str.append('\'');
          } else {
            return _str.toString();
          }
        } else {
          _str.append(st.gravel.support.jvm.ReadStreamExtensions.next(_stream));
        }
      }
    }
    throw ParseError.factory.basicNew();
  }

  public Node setSourcePosition_node_(final int _start, final Node _aNode) {
    final int _stop;
    if (_sourceFile == null) {
      return _aNode;
    }
    if (_aNode == null) {
      return null;
    }
    _stop = st.gravel.support.jvm.ReadStreamExtensions.position(_stream);
    return _aNode.withSourcePosition_(_sourceFile.from_to_(_start, _stop));
  }

  public java.nio.CharBuffer stream() {
    return _stream;
  }
}
TOP

Related Classes of st.gravel.support.compiler.ast.Parser$Parser_Factory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.