diff options
| author | Jed Barber <jjbarber@y7mail.com> | 2021-01-13 21:42:24 +1100 | 
|---|---|---|
| committer | Jed Barber <jjbarber@y7mail.com> | 2021-01-13 21:42:24 +1100 | 
| commit | 159759f78036288e267d587a97ff5d37b1527148 (patch) | |
| tree | ba78f9d9e351ef56194e32346c96e692515e8182 | |
| parent | c5f78d029ff16b8ee0f92186c0bfe6304a53d968 (diff) | |
Removed simple_calc
| -rw-r--r-- | example/simple_calc.adb | 237 | 
1 files changed, 0 insertions, 237 deletions
diff --git a/example/simple_calc.adb b/example/simple_calc.adb deleted file mode 100644 index e1a66c1..0000000 --- a/example/simple_calc.adb +++ /dev/null @@ -1,237 +0,0 @@ - - ---  This source is licensed under the Sunset License v1.0 - - -with - -    Ada.Text_IO, -    Ada.Strings.Unbounded, -    Ada.Strings.Maps, -    Ada.Command_Line, -    Packrat.Standard, -    Packrat.Utilities; - -use - -    Ada.Text_IO; - - -procedure Simple_Calc is - - -    type Lexer_Labels is (Whitespace, Number, Operator); -    type Parser_Labels is (Sum, Factor); - -    package My_Rat is new Packrat.Standard -        (Lexer_Labels, Parser_Labels, Character, String); - - - - -    --  Lexer Grammar - -    --  <number> ::= <digits> -    --  <digits> ::= <zerotonine> <digits> | <zerotonine> -    --  <zerotonine> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 - - -    function Is_Operator is new Packrat.Utilities.In_Set -        (Ada.Strings.Maps.To_Set ("+-")); -    function Sat_Operator is new My_Rat.Lexers.Satisfy (Is_Operator); -    function Operator is new My_Rat.Lexers.Stamp (Operator, Sat_Operator); - -    function Sat_Digit is new My_Rat.Lexers.Satisfy (Packrat.Utilities.Is_Digit); -    function Some_Digits is new My_Rat.Lexers.Many (Sat_Digit, 1); -    function Number is new My_Rat.Lexers.Stamp (Number, Some_Digits); - -    function Sat_Blank is new My_Rat.Lexers.Satisfy (Packrat.Utilities.Is_Whitespace); -    function Many_Blank is new My_Rat.Lexers.Many (Sat_Blank, 1); -    function Whitespace is new My_Rat.Lexers.Discard (Whitespace, Many_Blank); - -    package Scanner is new My_Rat.Lexers.Scan_Once -      ((Whitespace'Access, Number'Access, Operator'Access)); - - - - -    --  Parser Grammar - -    --  <expr> ::= <sum> <endofinput> -    --  <sum> ::= <sum> + <factor> | <sum> - <factor> | <factor> -    --  <factor> ::= <number> - - -    package Sum_Redir is new My_Rat.Parsers.Redirect; - -    function Is_Number is new My_Rat.Lexer_Tokens.Is_Label (Number); -    function Sat_Number is new My_Rat.Parsers.Satisfy (Is_Number); -    function Factor is new My_Rat.Parsers.Stamp (Factor, Sat_Number); - -    function Is_Minus is new My_Rat.Lexer_Tokens.Is_Value ("-"); -    function Sat_Minus is new My_Rat.Parsers.Satisfy (Is_Minus); -    function Is_Plus is new My_Rat.Lexer_Tokens.Is_Value ("+"); -    function Sat_Plus is new My_Rat.Parsers.Satisfy (Is_Plus); -    function Sum_Plus is new My_Rat.Parsers.Sequence -        ((Sum_Redir.Call'Access, Sat_Plus'Access, Factor'Access)); -    function Sum_Minus is new My_Rat.Parsers.Sequence -        ((Sum_Redir.Call'Access, Sat_Minus'Access, Factor'Access)); -    function Sum_Choice is new My_Rat.Parsers.Choice -        ((Sum_Plus'Access, Sum_Minus'Access, Factor'Access)); -    function Sum is new My_Rat.Parsers.Stamp (Sum, Sum_Choice); - -    function Expr is new My_Rat.Parsers.Sequence_2 (Sum, My_Rat.Parsers.End_Of_Input); - -    package Parser is new My_Rat.Parsers.Parse_Once (Expr); - - - - -    type Calc_Result is delta 10.0**(-9) digits 18; - - -    function Value -           (Tok : in My_Rat.Parser_Tokens.Finished_Token_Type) -        return String -    is -        Lexed : My_Rat.Lexer_Tokens.Token_Array := -            My_Rat.Parser_Tokens.Value (Tok.Token); -    begin -        if Lexed'Length = 0 then -            return ""; -        else -            return My_Rat.Lexer_Tokens.Value (Lexed (Lexed'First)); -        end if; -    end Value; - - -    function Element -           (Subs : in My_Rat.Parse_Graphs.Token_Group_Array; -            Ind  : in Positive) -        return My_Rat.Parser_Tokens.Finished_Token_Type is -    begin -        return My_Rat.Parse_Graphs.Element (Subs (Subs'First), Ind); -    end Element; - - -    function Evaluate -           (Graph    : in My_Rat.Parser_Result; -            Position : in My_Rat.Parser_Tokens.Finished_Token_Type) -        return Calc_Result -    is -        Subgroups : My_Rat.Parse_Graphs.Token_Group_Array := Graph.Subgroups (Position); -    begin -        case My_Rat.Parser_Tokens.Label (Position.Token) is -            when Sum => -                if Value (Position) = "+" then -                    return Evaluate (Graph, Element (Subgroups, 1)) + -                        Evaluate (Graph, Element (Subgroups, 2)); -                elsif Value (Position) = "-" then -                    return Evaluate (Graph, Element (Subgroups, 1)) - -                        Evaluate (Graph, Element (Subgroups, 2)); -                else -                    return Evaluate (Graph, Element (Subgroups, 1)); -                end if; -            when Factor => -                return Calc_Result (Integer'Value (Value (Position))); -        end case; -    end Evaluate; - - -    function Image -           (Val : in Calc_Result) -        return String is -    begin -        return Val'Image; -    end Image; - - - - -    package SU renames Ada.Strings.Unbounded; -    package Comlin renames Ada.Command_Line; - -    Comlin_Input : SU.Unbounded_String; -    Silent_Running : Boolean := False; -    Real_Arg_Count : Natural := 0; - - -begin - - -    Sum_Redir.Set (Sum'Access); - - -    for I in 1 .. Comlin.Argument_Count loop -        if Comlin.Argument (I) /= "--silent" then -            Real_Arg_Count := Real_Arg_Count + 1; -        end if; -    end loop; - - -    if Real_Arg_Count = 0 then -        Put_Line ("Simplified Command Line Calculator"); -        New_Line; -        Put_Line ("This program calculates elementary mathematical"); -        Put_Line ("expressions it receives as command line arguments."); -        Put_Line ("Naturally, it needs you to supply arguments for that."); -        Put_Line ("You may have to use quotes to ensure the shell doesn't mess with input."); -        New_Line; -        Put_Line ("Accepted operators are + -"); -        Put_Line ("Please ensure all numbers are positive integers."); -        New_Line; -        Put_Line ("If you do not want to see any output beyond the answer,"); -        Put_Line ("then use the --silent switch."); -        return; -    end if; - - -    for I in 1 .. Comlin.Argument_Count loop -        if Comlin.Argument (I) = "--silent" then -            Silent_Running := True; -        else -            SU.Append (Comlin_Input, Comlin.Argument (I) & " "); -        end if; -    end loop; -    SU.Delete (Comlin_Input, SU.Length (Comlin_Input), SU.Length (Comlin_Input)); - - -    declare -        Input : String := SU.To_String (Comlin_Input); -        Lexed_Tokens : My_Rat.Lexer_Result := Scanner.Scan (Input); -        Result_Graph : My_Rat.Parser_Result := Parser.Parse (Lexed_Tokens); -        Calculated : Calc_Result := Evaluate (Result_Graph, Result_Graph.Root_Elements (1)); -    begin -        if Silent_Running then -            Put_Line (Image (Calculated)); -            return; -        end if; - -        Put_Line ("Input:"); -        Put_Line (Input); -        New_Line; - -        Put_Line ("Lexer token output:"); -        for T of Lexed_Tokens loop -            Put (My_Rat.Lexer_Tokens.Debug_String (T)); -        end loop; -        New_Line; - -        Put_Line ("Parser graph output:"); -        Put_Line (My_Rat.Parse_Graphs.Debug_String (Result_Graph)); -        New_Line; - -        Put_Line ("Root tokens:"); -        for T of Result_Graph.Root_Elements loop -            Put (My_Rat.Parser_Tokens.Debug_String (T)); -        end loop; -        New_Line; - -        Put_Line ("Calculated result:"); -        Put_Line (Image (Calculated)); -    end; - - -end Simple_Calc; - -  | 
