anchor.diff:     : '@name' object '=' name password?
      ;
   
  +newpassswordcommand
  +   : '@newpassword' player ('=' password)?
  +   ;
  +
   ofailcommand
      : '@ofail' object ('=' message)?
      ;
  
positive.code:    : '@osuccess' object ('=' message)?
     ;
  
  setcommand
     : '@set' object '=' '!'? flag
     ;
  
  successcommand
     : '@success' object ('=' message)?
     ;
  
  unlinkcommand
     : '@unlink' dir
     ;
  
negative.code:    : '@unlock' object
     ;
  
  wallcommand
     : '@wall' message
     ;
  
  action
     : dropaction
     | examineaction
     | getaction
     | giveaction
     | gotoaction
     | gripeaction
     | helpaction
     | inventoryaction
     | killaction
     | lookaction
     | newsaction
     | pageaction
     | quitaction
     | robaction
     | sayaction
     | scoreaction
     | whisperaction
     | whoaction
     ;
  
  dropaction
     : ('drop' | 'throw') object
     ;
  
  examineaction
     : 'examine' object
     ;
  
  getaction
     : ('get' | 'take') object
     ;
  
  giveaction
     : 'give' player '=' pennies
     ;
  
  gotoaction
     : ('go' | 'goto' | 'move') direction
     ;
  
  gripeaction
     : 'gripe' message
     ;
  
  helpaction
     : 'help'
     ;
  
  inventoryaction
     : 'inventory'
     | 'inv'
     ;
  
  killaction
     : 'kill' player ('=' cost)
     ;
  
  lookaction
     : ('look' | 'read') object
     ;
  
  newsaction
     : 'news'
     ;
  
  pageaction
     : 'page' player ('=' message)
     ;
  
  quitaction
     : 'quit'
     ;
  
  robaction
     : 'rob' player
     ;
  
  sayaction
     : 'say' message
     ;
  
  scoreaction
     : 'score'
     ;
  
  whisperaction
     : 'whisper' player '=' message
     ;
  
  whoaction
     : 'who' player?
     ;
  
  object
     : STRING
     ;
  