// 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 grammar except ':' (U+003A), '=' (U+003D), '[' (U+005B), and ']' (U+005D) ? // // SkipState will skip (NL WS)+ // // comment -> # comment' | ; comment' // comment' -> epsilon | value package ini