コード例 #1
0
ファイル: parser.go プロジェクト: gliese1337/CS598R
func parse(l *lexer.Lexer) (VValue, bool) {
	token := l.Next()
	switch token.Type {
	case "symbol":
		return VSym(token.Token), true
	case "string":
		return VStr(token.Token), true
	case "number":
		num, err := strconv.ParseFloat(token.Token, 64)
		if err != nil {
			panic(fmt.Sprintf("Invalid Number \"%s\"", token.Token))
		}
		return VNum(num), true
	case "special":
		return parse_special(token.Token), true
	case ";":
		parse(l)
		return parse(l)
	case "EOF":
		return nil, false
	case "(":
		return parse_list(l)
	default:
		panic(fmt.Sprintf("Unexpected Token \"%s\"", token.Token))
	}
	return nil, false
}
コード例 #2
0
ファイル: parser.go プロジェクト: gliese1337/CS598R
func parse_list(l *lexer.Lexer) (VValue, bool) {
	token := l.Peek()
	switch token.Type {
	case ")":
		l.Next()
		return VNil, true
	case "EOF":
		return nil, false
	case ".":
		l.Next()
		return parse(l)
	}
	if car, ok := parse(l); ok {
		if cdr, ok := parse_list(l); ok {
			if _, ok := cdr.(*VPair); !ok {
				if l.Next().Type != ")" {
					panic("Can't have multiple cdr expressions")
				}
			}
			return &VPair{car, cdr}, true
		}
	}
	return nil, false
}