module FoodIngredientParser::Strict::Grammar

grammar IngredientNested
  include Common
  include Amount
  include IngredientSimple

  rule ingredient_nested
    ( ing:ingredient_simple              (ws* ':')? ws* '(' contains:ingredient_nested_in ws* ')' ws? mark:mark ws* amount:amount <NestedIngredientNode> ) /
    ( ing:ingredient_simple              (ws* ':')? ws* '(' contains:ingredient_nested_in ws* ')'               ws* amount:amount <NestedIngredientNode> ) /
    ( ing:ingredient_simple_with_amount  (ws* ':')? ws* '(' contains:ingredient_nested_in ws* ')' ws? mark:mark                   <NestedIngredientNode> ) /
    ( ing:ingredient_simple_with_amount  (ws* ':')? ws* '(' contains:ingredient_nested_in ws* ')'                                 <NestedIngredientNode> ) /
    ( ing:ingredient_simple              (ws* ':')? ws* '[' contains:ingredient_nested_in ws* ']' ws? mark:mark ws* amount:amount <NestedIngredientNode> ) /
    ( ing:ingredient_simple              (ws* ':')? ws* '[' contains:ingredient_nested_in ws* ']'               ws* amount:amount <NestedIngredientNode> ) /
    ( ing:ingredient_simple_with_amount  (ws* ':')? ws* '[' contains:ingredient_nested_in ws* ']' ws? mark:mark                   <NestedIngredientNode> ) /
    ( ing:ingredient_simple_with_amount  (ws* ':')? ws* '[' contains:ingredient_nested_in ws* ']'                                 <NestedIngredientNode> )
  end

  rule ingredient_nested_in
    ( ingredient_nested_contains (ws* ':')? ws+ )? ws* contains:list ws* '.'?
  end

  rule ingredient_nested_contains
    'contains'i /
    'bevat'i / 'bevat o.a.'i / 'o.a.'i / 'met'i
  end

end

end