// Package ini is an LL(1) parser for configuration files.
//
//	Example:
//	sections, err := ini.OpenFile("/path/to/file")
//	if err != nil {
//		panic(err)
//	}
//
//	profile := "foo"
//	section, ok := sections.GetSection(profile)
//	if !ok {
//		fmt.Printf("section %q could not be found", profile)
//	}
//
// Below is the BNF that describes this parser
//  Grammar:
//  stmt -> section | stmt'
//  stmt' -> epsilon | expr
//  expr -> value (stmt)* | equal_expr (stmt)*
//  equal_expr -> value ( ':' | '=' ) equal_expr'
//  equal_expr' -> number | string | quoted_string
//  quoted_string -> " quoted_string'
//  quoted_string' -> string quoted_string_end
//  quoted_string_end -> "
//
//  section -> [ section'
//  section' -> section_value section_close
//  section_value -> number | string_subset | boolean | quoted_string_subset
//  quoted_string_subset -> " quoted_string_subset'
//  quoted_string_subset' -> string_subset quoted_string_end
//  quoted_string_subset -> "
//  section_close -> ]
//
//  value -> number | string_subset | boolean
//  string -> ? UTF-8 Code-Points except '\n' (U+000A) and '\r\n' (U+000D U+000A) ?
//  string_subset -> ? Code-points excepted by <string> grammar except ':' (U+003A), '=' (U+003D), '[' (U+005B), and ']' (U+005D) ?
//
//  SkipState will skip (NL WS)+
//
//  comment -> # comment' | ; comment'
//  comment' -> epsilon | value
package ini