|  | @@ -0,0 +1,51 @@
 | 
	
		
			
				|  |  | +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;
 |