josh 22.4.15

GIT virtualization proxy
Documentation
WHITESPACE = _{ " " }
CMD_START = _{ ":" }
CMT_START = _{ "#" }
CMD_END = _{("="|"/")}
CMD_SEP = _{(","|NEWLINE)}
ALNUM = _{( ASCII_ALPHANUMERIC | "_" | "-" | "+" | "." | "*" | "~")}
GROUP_START = _{ "[" }
GROUP_END = _{ "]" }

filter_spec = { (
    filter_group
  | filter_presub
  | filter_subdir
  | filter_nop
  | filter
  | filter_noarg
)+ }

filter_group = { CMD_START ~ cmd? ~ GROUP_START ~ compose ~ GROUP_END }
filter_subdir = { CMD_START ~ "/" ~ argument }
filter_nop = { CMD_START ~ "/" }
filter_presub = { CMD_START ~ ":" ~ argument }
filter = { CMD_START ~ cmd ~ "=" ~ (argument ~ ("," ~ argument)*)? }
filter_noarg = { CMD_START ~ cmd }

argument = { (ALNUM | "/" )+ }

cmd = { ALNUM+ }

file_entry = { dst_path ~ "=" ~ filter_spec }

compose = {
    NEWLINE*
    ~ (filter_spec|file_entry)?
    ~ (CMD_SEP+ ~ (filter_spec|file_entry))*
    ~ NEWLINE*
}

workspace_comments = { 
    NEWLINE*
    ~ ( (CMT_START ~ (!NEWLINE ~ ANY)*)
        ~ NEWLINE*)+
}

workspace_file = {
    workspace_comments?
    ~ compose
    ~ EOI
}

filter_chain = _{ filter_spec ~ EOI }

dst_path = @{ path ~ ("/" ~ path)* }
path = @{ ALNUM+ }