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; } }