module FoodIngredientParser::Strict::Grammar

grammar IngredientColoned
  include Common
  include Amount
  include IngredientSimple

  rule ingredient_coloned
    ing:ingredient_simple ws* ':' ws* amount:amount post:( ws* '}' )? !( ws* word )                <IngredientNode> /
    ing:ingredient_simple ws* ':' post:( ws* '}' )? ws* contains:( ingredient_coloned_inner_list ) <NestedIngredientNode>
  end

  rule ingredient_coloned_inner_list
    contains:( ingredient_simple_e_number ( ws* dash ws* ingredient_simple_e_number )+ ) <ListNode> /
    contains:( ingredient_coloned_simple_with_amount_and_nest ( ws* '/'+ ws* ingredient_coloned_simple_with_amount_and_nest )* ) <ListNode>
  end

  # @see IngredientSimple#ingredient_simple
  rule ingredient_coloned_simple
    name:( ingredient_coloned_word ( ws+ !amount ingredient_coloned_word )* ) ws? mark:mark <IngredientNode> /
    name:( ingredient_coloned_word ( ws+ !amount ingredient_coloned_word )* )               <IngredientNode>
  end

  # @see IngredientSimple#ingredient_simple_with_amount
  rule ingredient_coloned_simple_with_amount
    pre:( '{' ws* )? amount:amount ws+ ing:ingredient_coloned_simple                   <IngredientNode> /
    ing:ingredient_coloned_simple ws* amount:amount post:( ws* '}' )? (ws? mark:mark)? <IngredientNode> /
    ing:ingredient_coloned_simple                                                      <IngredientNode>
  end

  rule ingredient_coloned_simple_with_amount_and_nest
    ing:ingredient_coloned_simple_with_amount ws* '(' ws* contains:ingredient_coloned_simple_with_amount ws* ')' ( ws* '}' )? <NestedIngredientNode> /
    ingredient_coloned_simple_with_amount
  end

  # @see Common#word
  rule ingredient_coloned_word
    abbrev / word_complex / ( !'/' char )+
  end

end

end