anchor.diff:      | '=..'
       | 'is' | '=:=' | '=\\=' | '<' | '=<' | '>' | '>='
       | '+' | '-' | '/\\' | '\\/'
  -    | '*' | '/' | '//' | 'rem' | 'mod' | '<<' | '>>'
  +    | '*' | '/' | '//' | 'rem' | 'mod' | '<<' | '>>' //TODO: '/' cannot be used as atom because token here not in GRAPHIC. only works because , is operator too. example: swipl/filesex.pl:177
       | '**'
       | '^'
       | '\\'
  
positive.code:     | '-'? FLOAT        # float
      // structure / compound term
      | atom '(' termlist ')'     # compound_term
      | term operator term        # binary_operator //FIXME: , should have precedence over :- see e.g. `head :- one, two.`
      | operator term             # unary_operator
      | '[' termlist ( '|' term )? ']' # list_term //TODO: priority <= 999 //TODO: find out what [|] list syntax means
      | '{' termlist '}'          # curly_bracketed_term
      | atom              # atom_term
      ;
  
  operator //TODO: modifying operator table
      : ':-' | '-->'
      | '?-'
      | ';'
      | '->'
      | ','
  
negative.code: 
  p_text: (directive | clause) * EOF ;
  
  directive: ':-' term '.' ; // also 3.58
  
  clause: term '.' ; // also 3.33
  
  
  // Abstract Syntax (6.3): terms formed from tokens
  
  termlist
      : term ( ',' term )*
      ;
  
  term 
  