grammar MenuMarkup

rule root
  s menu
end

rule menu
  (section / item)*
end

rule subsections
  (subsection / item)*
end

rule subsubsections
  (subsubsection / item)*
end

rule items do
  item*
end

rule section
  s '*' choice_node:choice attributes_node:(attributes '*')? s description_node:description children_nodes:subsections <MenuMarkupParser::Section>
end

rule subsection
  s '**' choice_node:choice attributes_node:(attributes '**')? s description_node:description children_nodes:subsubsections <MenuMarkupParser::Section>
end

rule subsubsection
  s '***' choice_node:choice attributes_node:(attributes '***')? s description_node:description children_nodes:items <MenuMarkupParser::Section>
end

rule item
  s '-' attributes_node:(attributes '-')? s description_node:description <MenuMarkupParser::Item>
end

rule choice
  '/'?
end

rule attributes
  [vVhknmMH]* <MenuMarkupParser::Attributes>
end

rule price
  s '=' s text_node:text_line
end

rule description
  description_line*
end

rule description_line
  text:([^-*#] text_line) s
end

rule s #optional space
  S?
end

rule S # mandatory space
  (comment / whitespace)+
end

rule whitespace
  [\s]+
end

rule comment
  '#' text_line
end

rule text_line
  [^\r\n]*
end

end