diff options
| -rw-r--r-- | packrat_parser_lib_notes.txt | 19 | ||||
| -rw-r--r-- | src/packrat-errors.adb | 105 | ||||
| -rw-r--r-- | src/packrat.adb | 11 | ||||
| -rw-r--r-- | src/packrat.ads | 85 | ||||
| -rw-r--r-- | test/ratnest-tests.adb | 144 | ||||
| -rw-r--r-- | test/ratnest-tests.ads | 22 | ||||
| -rw-r--r-- | test/test_main.adb | 4 | 
7 files changed, 386 insertions, 4 deletions
| diff --git a/packrat_parser_lib_notes.txt b/packrat_parser_lib_notes.txt index a09babf..8bcac69 100644 --- a/packrat_parser_lib_notes.txt +++ b/packrat_parser_lib_notes.txt @@ -220,18 +220,26 @@ Pretty_Print  Packrat.Error  (actually a nested package, as this functionality is important to parsers/lexers)   - functions to handle and process exception messages - - exception messages take the form of one or more "s<SYMBOLNAME>p<POSITION>" separated by a space + - exception messages take the form of one or more "s<SYMBOLNAME>p<POSITION>" substrings joined together, +   with each symbol name being in all capitals and each position being a positive integer   - this message represents the list of expected symbols at particular positions that would have resulted in a     more complete parse + - one of these messages will be raised with an exception of no valid parse is possible with a given input  List of datatypes: -Error_Info (containing an enum of the symbol expected, and a natural of the position) +Error_Message +Error_Info (containing a string of the symbol name expected, and a natural of the position) +Error_Info_Array  List of funcs: -Newcode +Valid_Message +Valid_Identifier +Valid_Identifier_Array +Join  Encode +Encode_Array  Decode -Join +(the message format ensures that using "&" to join messages will still result in a valid message) @@ -249,6 +257,9 @@ Run_Tests  Ratnest.Tests  List of funcs: +In_Set_Check +Not_In_Set_Check +  Is_Digit_Check  Is_Hex_Check  Is_Letter_Check diff --git a/src/packrat-errors.adb b/src/packrat-errors.adb new file mode 100644 index 0000000..44b9202 --- /dev/null +++ b/src/packrat-errors.adb @@ -0,0 +1,105 @@ + + +separate (Packrat) +package body Errors is + + +    package SU renames Ada.Strings.Unbounded; + + + + + +    function Valid_Identifier +           (Check : in String) +        return Boolean is +    begin +        return True; +    end Valid_Identifier; + + +    function Valid_Identifier +           (Check : in SU.Unbounded_String) +        return Boolean is +    begin +        return True; +    end Valid_Identifier; + + +    function Valid_Identifier_Array +           (Check : in Error_Info_Array) +        return Boolean is +    begin +        return True; +    end Valid_Identifier_Array; + + +    function Valid_Message +           (Check : in String) +        return Boolean is +    begin +        return True; +    end Valid_Message; + + + + + +    function Join +           (Left, Right : in Error_Message) +        return Error_Message is +    begin +        return ""; +    end Join; + + + + + +    function Encode +           (Name : in String; +            Pos  : in Natural) +        return Error_Message is +    begin +        return ""; +    end Encode; + + +    function Encode +           (Name : in SU.Unbounded_String; +            Pos  : in Natural) +        return Error_Message is +    begin +        return ""; +    end Encode; + + +    function Encode +           (Info : in Error_Info) +        return Error_Message is +    begin +        return ""; +    end Encode; + + +    function Encode_Array +           (Info : in Error_Info_Array) +        return Error_Message is +    begin +        return ""; +    end Encode_Array; + + +    function Decode +           (Msg : in Error_Message) +        return Error_Info_Array +    is +        Result : Error_Info_Array (1 .. 0); +    begin +        return Result; +    end Decode; + + +end Errors; + + diff --git a/src/packrat.adb b/src/packrat.adb new file mode 100644 index 0000000..e78d0ae --- /dev/null +++ b/src/packrat.adb @@ -0,0 +1,11 @@ + + +package body Packrat is + + +    package body Errors is separate; + + +end Packrat; + + diff --git a/src/packrat.ads b/src/packrat.ads index 36410d5..628923f 100644 --- a/src/packrat.ads +++ b/src/packrat.ads @@ -1,8 +1,93 @@ +with + +    Ada.Strings.Unbounded; + +  package Packrat is +    Parse_Error : exception; + + + + +    package Errors is + + +        subtype Error_Message is String +            with Dynamic_Predicate => Valid_Message (Error_Message); + +        type Error_Info is record +            Symbol   : Ada.Strings.Unbounded.Unbounded_String; +            Position : Natural; +        end record; + +        type Error_Info_Array is array (Positive range <>) of Error_Info; + + +        --  Note: No consideration is given to ordering of Error_Info items +        --        encoded into an Error_Message string. + +        --  Note: Using "&" to join two Valid Error_Messages together +        --        will result in an Error_Message that is also Valid, +        --        but for best results Join should be used instead to +        --        prevent duplication of Error_Info in the message. + + +        function Valid_Identifier +               (Check : in String) +            return Boolean; + +        function Valid_Identifier +               (Check : in Ada.Strings.Unbounded.Unbounded_String) +            return Boolean; + +        function Valid_Identifier_Array +               (Check : in Error_Info_Array) +            return Boolean; + +        function Valid_Message +               (Check : in String) +            return Boolean; + + +        function Join +               (Left, Right : in Error_Message) +            return Error_Message; + + +        function Encode +               (Name : in String; +                Pos  : in Natural) +            return Error_Message +            with Pre => Valid_Identifier (Name); + +        function Encode +               (Name : in Ada.Strings.Unbounded.Unbounded_String; +                Pos  : in Natural) +            return Error_Message +            with Pre => Valid_Identifier (Name); + +        function Encode +               (Info : in Error_Info) +            return Error_Message +            with Pre => Valid_Identifier (Info.Symbol); + +        function Encode_Array +               (Info : in Error_Info_Array) +            return Error_Message +            with Pre => Valid_Identifier_Array (Info); + +        function Decode +               (Msg : in Error_Message) +            return Error_Info_Array; + + +    end Errors; + +  private diff --git a/test/ratnest-tests.adb b/test/ratnest-tests.adb index 3309b2a..2e3478a 100644 --- a/test/ratnest-tests.adb +++ b/test/ratnest-tests.adb @@ -12,12 +12,156 @@ package body Ratnest.Tests is      package Latin renames Ada.Characters.Latin_1;      package Strmaps renames Ada.Strings.Maps; +    package PE renames Packrat.Errors;      package PU renames Packrat.Util; +    function Valid_Message_Check +        return Test_Result is +    begin +        if  PE.Valid_Message ("abcde") or PE.Valid_Message ("sSYM") or +            PE.Valid_Message ("sSYMp") or PE.Valid_Message ("p345") or +            PE.Valid_Message ("pOne") or PE.Valid_Message ("sSYMp1sNEXT") or +            PE.Valid_Message ("sSYMp1.2") or PE.Valid_Message ("sABcDp12") or +            not PE.Valid_Message ("sSYMp0") or not PE.Valid_Message ("sAp12") or +            not PE.Valid_Message ("sNAMEp34sSYMp02") or not PE.Valid_Message ("") or +            not PE.Valid_Message ("sA_Bp3") +        then +            return Failure; +        end if; +        return Success; +    end Valid_Message_Check; + + +    function Valid_Identifier_Check +        return Test_Result +    is +        Pass_Array : PE.Error_Info_Array := +            ((+"A", 1), (+"ABC", 2), (+"AB_CD", 3), (+"A_B_CD", 4)); +        Fail_Array : PE.Error_Info_Array := +            ((+"_", 1), (+"_A", 2), (+"A_", 3), (+"A__B", 4)); +    begin +        for EI of Pass_Array loop +            if  not PE.Valid_Identifier (EI.Symbol) or +                not PE.Valid_Identifier (-EI.Symbol) +            then +                return Failure; +            end if; +        end loop; +        for EI of Fail_Array loop +            if  PE.Valid_Identifier (EI.Symbol) or +                PE.Valid_Identifier (-EI.Symbol) +            then +                return Failure; +            end if; +        end loop; +        if  not PE.Valid_Identifier_Array (Pass_Array) or +            PE.Valid_Identifier_Array (Fail_Array) +        then +            return Failure; +        end if; +        return Success; +    end Valid_Identifier_Check; + + +    function Join_Check +        return Test_Result +    is +        Array_1 : PE.Error_Info_Array := ((+"A", 1), (+"B", 2)); +        Msg_1 : PE.Error_Message := PE.Encode_Array (Array_1); + +        Array_2 : PE.Error_Info_Array := ((+"C", 3), (+"D", 4)); +        Msg_2 : PE.Error_Message := PE.Encode_Array (Array_2); + +        Msg_3 : PE.Error_Message := PE.Join (Msg_1, Msg_2); + +        Array_4 : PE.Error_Info_Array := ((+"A", 1), (+"B", 2), (+"C", 3), (+"D", 4)); +        Msg_4 : PE.Error_Message := PE.Encode_Array (Array_4); + +        Array_5 : PE.Error_Info_Array := ((+"A", 1), (+"B", 4)); +        Msg_5 : PE.Error_Message := PE.Encode_Array (Array_5); + +        Array_6 : PE.Error_Info_Array := ((+"A", 1), (+"C", 3)); +        Msg_6 : PE.Error_Message := PE.Encode_Array (Array_6); + +        Msg_7 : PE.Error_Message := PE.Join (Msg_5, Msg_6); + +        Array_8 : PE.Error_Info_Array := ((+"A", 1), (+"B", 4), (+"C", 3)); +        Msg_8 : PE.Error_Message := PE.Encode_Array (Array_8); +    begin +        if Msg_3 /= Msg_4 or Msg_7 /= Msg_8 then +            return Failure; +        end if; +        return Success; +    end Join_Check; + + +    function Encode_1_Check +        return Test_Result is +    begin +        --  Encode with a String and a Natural +        if PE.Encode ("ABC", 15) /= "sABCp15" then +            return Failure; +        end if; +        return Success; +    end Encode_1_Check; + + +    function Encode_2_Check +        return Test_Result is +    begin +        --  Encode with an Unbounded_String and a Natural +        if PE.Encode (+"ABC", 15) /= "sABCp15" then +            return Failure; +        end if; +        return Success; +    end Encode_2_Check; + + +    function Encode_3_Check +        return Test_Result is +    begin +        --  Encode with an Error_Info +        if PE.Encode ((+"ABC", 15)) /= "sABCp15" then +            return Failure; +        end if; +        return Success; +    end Encode_3_Check; + + +    function Encode_4_Check +        return Test_Result is +    begin +        --  Encode with an Error_Info_Array +        if  PE.Encode_Array (((+"A", 3), (+"BC", 2), (+"ABC", 1), (+"B", 4))) /= +            "sAp3sBCp2sABCp1sBp4" +        then +            return Failure; +        end if; +        return Success; +    end Encode_4_Check; + + +    function Decode_Check +        return Test_Result +    is +        use type PE.Error_Info_Array; +    begin +        if PE.Decode ("sAp1sBp3sCp10sDEFp456") /= +            ((+"A", 1), (+"B", 3), (+"C", 10), (+"DEF", 456)) +        then +            return Failure; +        end if; +        return Success; +    end Decode_Check; + + + + +      function In_Set_Check          return Test_Result      is diff --git a/test/ratnest-tests.ads b/test/ratnest-tests.ads index fdcbe71..db20313 100644 --- a/test/ratnest-tests.ads +++ b/test/ratnest-tests.ads @@ -3,6 +3,28 @@  package Ratnest.Tests is +    function Valid_Message_Check return Test_Result; +    function Valid_Identifier_Check return Test_Result; +    function Join_Check return Test_Result; +    function Encode_1_Check return Test_Result; +    function Encode_2_Check return Test_Result; +    function Encode_3_Check return Test_Result; +    function Encode_4_Check return Test_Result; +    function Decode_Check return Test_Result; + +    Error_Tests : Test_Array := +       ((+"Valid_Message", Valid_Message_Check'Access), +        (+"Valid_Identifier", Valid_Identifier_Check'Access), +        (+"Join", Join_Check'Access), +        (+"Encode_1", Encode_1_Check'Access), +        (+"Encode_2", Encode_2_Check'Access), +        (+"Encode_3", Encode_3_Check'Access), +        (+"Encode_4", Encode_4_Check'Access), +        (+"Decode", Decode_Check'Access)); + + + +      function In_Set_Check return Test_Result;      function Not_In_Set_Check return Test_Result; diff --git a/test/test_main.adb b/test/test_main.adb index 3ab5269..0ce72b1 100644 --- a/test/test_main.adb +++ b/test/test_main.adb @@ -14,6 +14,10 @@ use  procedure Test_Main is  begin +    Put_Line ("Running tests for Packrat.Errors..."); +    Run_Tests (Error_Tests); +    New_Line; +      Put_Line ("Running tests for Packrat.Util...");      Put_Line ("Testing set predicates...");      Run_Tests (Set_Predicate_Tests); | 
