{ our $self; }

rc_file: <skip: qr/[ \t]*/> chunk(s)

#############################################################################

chunk: comment |
       statement |
       conditional |
       <resync>

#############################################################################

comment: "%" /.*/

statement: setkey |
           set |
           color |
           mono |
           include |
           interpret |
           server |
           header_display_format |
           group_display_format |
           ignore_quotes |
           visible_headers |
           compatible_charsets |
           grouplens_add |
           nnrpaccess |
           posting_host |
           strip_re_regexp |
           strip_sig_regexp |
           strip_was_regexp |
           unsetkey |
           option

conditional: /#if.*?#endif/s
  { my $string = "";
    $string .= $_ foreach (@item[1..$#item]);
    $self -> add("unknown", "$string\n"); }

#############################################################################

setkey: "setkey" key_map key_function value
  { $self -> append("setkey",
                                  $item{ key_map },
                                  $item{ key_function },
                                  $item{ value } . "<=>"); }

set: "set" identifier value
  { $self -> set("set", $item{ identifier }, $item{ value }); }

color: "color" identifier value(2)
  { my ($fg, $bg) = @{$item{ 'value(2)' }};
    $self -> set("color", $item{ identifier } . "_fg", $fg);
    $self -> set("color", $item{ identifier } . "_bg", $bg); }

mono: "mono" identifier value(..4)
  { my ($one, $two, $three, $four) = @{$item{ 'value(..4)' }};
    $self -> set("mono", $item{ identifier } . "_one", $one);
    $self -> set("mono", $item{ identifier } . "_two", $two || "none");
    $self -> set("mono", $item{ identifier } . "_three", $three || "none");
    $self -> set("mono", $item{ identifier } . "_four", $four || "none"); }

include: "include" value
  { $self -> add("include", $item{ value }); }

interpret: "interpret" value
  { $self -> add("interpret", $item{ value }); }

server: "server" value(2)
  { $self -> add("server", join(" => ", @{$item{ 'value(2)' }})); }

header_display_format: "header_display_format" number value
  { $self -> index_set("header_display_format", $item{ number }, $item{ value }); }

group_display_format: "group_display_format" number value
  { $self -> index_set("group_display_format", $item{ number }, $item{ value }); }

ignore_quotes: "ignore_quotes" value
  { $self -> set("ignore_quotes", $item{ value }); }

visible_headers: "visible_headers" value
  { $self -> set("visible_headers", $item{ value }); }

compatible_charsets: "compatible_charsets" value
  { $self -> set("compatible_charsets", $item{ value }); }

grouplens_add: "grouplens_add" value
  { $self -> add("grouplens_add", $item{ value }); }

nnrpaccess: "nnrpaccess" value(3)
  { $self -> add("nnrpaccess", join(" => ", @{$item{ 'value(3)' }})); }

posting_host: "posting_host" value
  { $self -> set("posting_host", $item{ value }); }

strip_re_regexp: "strip_re_regexp" value(..5)
  { $self -> add("strip_re_regexp", $_) foreach (@{$item{ 'value(..5)' }}); }

strip_sig_regexp: "strip_sig_regexp" value(..5)
  { $self -> add("strip_sig_regexp", $_) foreach (@{$item{ 'value(..5)' }}); }

strip_was_regexp: "strip_was_regexp" value(..5)
  { $self -> add("strip_was_regexp", $_) foreach (@{$item{ 'value(..5)' }}); }

unsetkey: "unsetkey" key_map key_function
  { $self -> unset("setkey",
                                 $item{ key_map },
                                 $item{ key_function }); }

option: "autobaud"
  { $self -> set($item[1], 1); }

#############################################################################

identifier: word

value: word | number | double_quoted | single_quoted

#############################################################################

key_map: "article" | "group" | "readline"

key_function: key_module(s?) word
  { $return = "@{$item{ 'key_module(s?)' }}$item{ word }"; }

key_module: word "->"
  { $return = $item{ word } . " -> "; }

#############################################################################

word: /[a-zA-Z0-9._@<>\/\\-]+/

number: /(?:-|\+)?(?:\.|\d)+/

double_quoted: /"((?:[^"]|(?<=\\)(?<!\\\\)")*)"/
  { $return = $1; }

single_quoted: /'((?:[^']|(?<=\\)(?<!\\\\)')*)'/
  { $return = $1; }
