anchor.diff:  binaryTail : binaryMessage binaryTail?;
   binaryMessage : ws BINARY_SELECTOR ws (unarySend | operand);
   
  +SEPARATOR : [ \t\r\n];
  +STRING : '\'' (.)*? '\'';
  +COMMENT : '"' (.)*? '"';
  +BLOCK_START : '[';
  +BLOCK_END : ']';
  +CLOSE_PAREN : ')';
  +OPEN_PAREN : '(';
   PIPE : '|';
   PERIOD : '.';
  +SEMI_COLON : ';';
  +BINARY_SELECTOR : ('\\' | '+' | '*' | '/' | '=' | '>' | '<' | ',' | '@' | '%' | '~' | PIPE | '&' | '-' | '?')+;
  +LT : '<';
  +GT : '>';
  +MINUS : '-';
  +RESERVED_WORD : 'nil' | 'true' | 'false' | 'self' | 'super';
  +IDENTIFIER : [a-zA-Z]+[a-zA-Z0-9_]*;
   CARROT : '^';
   COLON : ':';
  -SEMI_COLON : ';';
   ASSIGNMENT : ':=';
  -MINUS : '-';
   HASH : '#';
   DOLLAR : '$';
   EXP : 'e';
   HEX : '16r';
   LITARR_START : '#(';
  -CLOSE_PAREN : ')';
  -OPEN_PAREN : '(';
   DYNDICT_START : '#{';
   DYNARR_END : '}';
   DYNARR_START : '{';
  -BLOCK_START : '[';
  -BLOCK_END : ']';
  -LT : '<';
  -GT : '>';
  -RESERVED_WORD : 'nil' | 'true' | 'false' | 'self' | 'super';
   DIGIT : [0-9];
   HEXDIGIT : [0-9a-fA-F];
  -BINARY_SELECTOR : ('-' | '\\' | '+' | '*' | '/' | '=' | '>' | '<' | ',' | '@' | '%' | '~' | '|' | '&' | '?')+;
  -IDENTIFIER : [a-zA-Z][a-zA-Z0-9_]*;
   KEYWORD : IDENTIFIER COLON;
   BLOCK_PARAM : COLON IDENTIFIER;
   CHARACTER_CONSTANT : DOLLAR (HEXDIGIT | DOLLAR);
  -SEPARATOR : ' ' | '\t' | '\r' | '\n';
  -STRING : '\'' (.)*? '\'';
  -COMMENT : '"' (.)*? '"';
  -
  
positive.code: /*
    Converted to ANTLR 4 by James Ladd (Redline Smalltalk Project http://redline.st).
    Adapted from the Amber Smalltalk grammar perser.pegjs 
    
    2013/11/27 James Ladd (object@redline.st)
  */
  
  grammar Smalltalk;
  
  script : ws sequence EOF;
  sequence : temps? ws statements? ws;
  ws : (SEPARATOR | COMMENT)*;
  temps : PIPE (ws IDENTIFIER)* ws PIPE;
  statements : answer # StatementAnswer
             | expressions ws PERIOD ws answer # StatementExpressionsAnswer
             | expressions PERIOD? # StatementExpressions
  
negative.code: literal : runtimeLiteral | parsetimeLiteral;
  runtimeLiteral : dynamicDictionary | dynamicArray | block;
  block : BLOCK_START blockParamList? ws sequence? BLOCK_END;
  blockParamList : (ws BLOCK_PARAM)+;
  dynamicDictionary : DYNDICT_START ws expressions? ws DYNARR_END;
  dynamicArray : DYNARR_START ws expressions? ws DYNARR_END;
  parsetimeLiteral : pseudoVariable | number | charConstant | literalArray | string | symbol;
  