func Parse(src *Source, lexer Lexer, precedence int) interface{} {
	token := lexer.PrefixToken(src)
	if token == nil {
		src.ReportError(errors.New("can not parse"))
		return nil
	}
	InfoLogger.Println("prefix", ">>>", reflect.TypeOf(token))
	left := token.PrefixParse(src)
	InfoLogger.Println("prefix", "<<<", reflect.TypeOf(token))
	for {
		if src.Error() != nil {
			return left
		}
		token, infixPrecedence := lexer.InfixToken(src)
		if token == nil {
			return left
		}
		if precedence >= infixPrecedence {
			InfoLogger.Println("precedence skip ", reflect.TypeOf(token), precedence, infixPrecedence)
			return left
		}
		InfoLogger.Println("infix ", ">>>", reflect.TypeOf(token))
		left = token.InfixParse(src, left)
		InfoLogger.Println("infix ", "<<<", reflect.TypeOf(token))
	}
}
Parse parse the source with provided lexer, might call this recursively.
If precedence > 0, some infix will be skipped due to precedence.
package parse
import (
	"errors"
	"io"
	"reflect"
)
func String(input string, lexer Lexer) (interface{}, error) {
	src, err := NewSourceString(input)
	if nil != err {
		return nil, err
	}
	left := Parse(src, lexer, 0)
	if src.Error() != nil {
		if src.Error() == io.EOF {
			return left, nil
		}
		return nil, src.Error()
	}
	return left, nil
}