1// Package ini is an LL(1) parser for configuration files.
2//
3//	Example:
4//	sections, err := ini.OpenFile("/path/to/file")
5//	if err != nil {
6//		panic(err)
7//	}
8//
9//	profile := "foo"
10//	section, ok := sections.GetSection(profile)
11//	if !ok {
12//		fmt.Printf("section %q could not be found", profile)
13//	}
14//
15// Below is the BNF that describes this parser
16//  Grammar:
17//  stmt -> section | stmt'
18//  stmt' -> epsilon | expr
19//  expr -> value (stmt)* | equal_expr (stmt)*
20//  equal_expr -> value ( ':' | '=' ) equal_expr'
21//  equal_expr' -> number | string | quoted_string
22//  quoted_string -> " quoted_string'
23//  quoted_string' -> string quoted_string_end
24//  quoted_string_end -> "
25//
26//  section -> [ section'
27//  section' -> section_value section_close
28//  section_value -> number | string_subset | boolean | quoted_string_subset
29//  quoted_string_subset -> " quoted_string_subset'
30//  quoted_string_subset' -> string_subset quoted_string_end
31//  quoted_string_subset -> "
32//  section_close -> ]
33//
34//  value -> number | string_subset | boolean
35//  string -> ? UTF-8 Code-Points except '\n' (U+000A) and '\r\n' (U+000D U+000A) ?
36//  string_subset -> ? Code-points excepted by <string> grammar except ':' (U+003A), '=' (U+003D), '[' (U+005B), and ']' (U+005D) ?
37//
38//  SkipState will skip (NL WS)+
39//
40//  comment -> # comment' | ; comment'
41//  comment' -> epsilon | value
42package ini
43