with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with GNAT.Regpat; use GNAT.Regpat; with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Fixed; use Ada.Strings.Fixed; -- This code reads its input from standard input -- Use cat _input.txt | Mull_It_Over_ to get the result procedure Mull_It_Over is subtype Operand is Positive; -- Use pattern to match mul operations Mul_Pattern : constant Pattern_Matcher := Compile ("mul\(([0-9]+),([0-9]+)\)"); Sum : Natural := 0; begin while not End_Of_File loop declare Line : constant String := Get_Line; Remaining : String := Line; Matches : Match_Array (0 .. Paren_Count (Mul_Pattern)); begin Match (Mul_Pattern, Remaining, Matches); -- Iterate on all match of the line while Matches (0) /= No_Match loop declare Operand_1 : Operand; Operand_2 : Operand; Last : Positive; begin Get (Remaining (Matches (1).First .. Matches (1).Last), Operand_1, Last); Get (Remaining (Matches (2).First .. Matches (2).Last), Operand_2, Last); Sum := Sum + Operand_1 * Operand_2; end; -- Copy without last parenthesis Move (Remaining (Matches (2).Last + 2 .. Remaining'Last), Remaining); Match (Mul_Pattern, Remaining, Matches); end loop; end; end loop; Put_Line ("The sum is " & Sum'Image); end Mull_It_Over;