anchor.diff:  super = '^' simp
   sub =  '_' simp
   simp = constant | paren_expr | unary_expr | binary_expr | text
  -paren_expr = lparen expr rparen
  +paren_expr = lparen asciimath rparen
   lparen = '(' | '[' | '{' | '(:' | '{:'
   rparen = ')' | ']' | '}' | ':)' | ':}'
   unary_expr = unary_op simp
  
positive.code: ----
  
  Super and Sub Script::
  +
  [source]
  ----
  
negative.code: }
  ----
  
  Constants::
  +
  `symbol` (mathematical operators, function names, arrows, accents, greek letters, etc.) are all converted to Symbols.
  The <<symbol_table>> below list all the symbols that are recognized by the parser.
  +
  `text`, `number` and `identifier` are converted to Strings.
  
  Matrices::
  Matrices in AsciiMath are a special case of nested `paren_expr`.
  The matrix itself can be any `paren_expr`.
  Inside this outer matrix `paren_expr` each row should be represented as a `paren_expr` using either `()` or `[]`.
  Rows must be separated by commas (`,`).
  The elements of each row must also be separated by commas.
  Each row must contain the same number of elements.
  +
  When the parser detects a well-formed matrix expression it will strip away the `paren_expr` representation of the matrix and each row.
  Instead it returns a Hash of the following form.
  The `rows` value contains an Array with one element per row.
  Each row Array contains one element per column.
  Each column element is represented using the appropriate AST type.
  +
  [source]
  ----
  