code: function parsePrimary() {
                      var token, expr;
  
                      token = lexer.peek();
  
                      if (typeof token === 'undefined') {
                          throw new SyntaxError('Unexpected termination of expression');
                      }
  
                      if (token.type === T.Identifier) {
                          token = lexer.next();
                          if (matchOp(lexer.peek(), '(')) {
                              return parseFunctionCall(token.value);
                          } else {
                              return MathLib.Expression.variable(token.value);
                          }
                      }
  
                      if (token.type === T.Number) {
                          token = lexer.next();
                          return MathLib.Expression.number(token.value);
                      }
  
                      if (matchOp(token, '(')) {
                          lexer.next();
                          expr = parseAssignment();
                          token = lexer.next();
                          if (!matchOp(token, ')')) {
                              throw new SyntaxError('Expecting )');
                          }
                          return new MathLib.Expression({
                              subtype: 'brackets',
                              value: 'brackets',
                              content: expr
                          });
                      }
  
                      throw new SyntaxError('Parse error, can not process token ' + token.value);
                  }
docs: Primary ::= Identifier | Number | '(' Assignment ')' | FunctionCall