Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/RNGTest/InputDeck/Grammar.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief Random number generator test suite grammar definition
9 : : \details Random number generator test suite input deck grammar definition.
10 : : We use the Parsing Expression Grammar Template Library (PEGTL) to create the
11 : : grammar and the associated parser. Word of advice: read from the bottom up.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef RNGTestInputDeckGrammar_h
15 : : #define RNGTestInputDeckGrammar_h
16 : :
17 : : #include "CommonGrammar.hpp"
18 : : #include "Keywords.hpp"
19 : : #include "WalkerConfig.hpp"
20 : :
21 : : #ifdef HAS_MKL
22 : : #include "MKLGrammar.hpp"
23 : : #endif
24 : :
25 : : #ifdef HAS_RNGSSE2
26 : : #include "RNGSSEGrammar.hpp"
27 : : #endif
28 : :
29 : : #include "Random123Grammar.hpp"
30 : :
31 : : namespace rngtest {
32 : :
33 : : extern ctr::InputDeck g_inputdeck_defaults;
34 : :
35 : : //! RNGTest input deck facilitating user input for testing RNGs
36 : : namespace deck {
37 : :
38 : : //! \brief Specialization of tk::grm::use for RNGTest's control file parser
39 : : template< typename keyword >
40 : : using use = tk::grm::use< keyword, ctr::InputDeck::keywords >;
41 : :
42 : : } // ::deck
43 : : } // ::rngtest
44 : :
45 : : namespace tk {
46 : : namespace grm {
47 : :
48 : : using namespace tao;
49 : :
50 : : // Note that PEGTL action specializations must be in the same namespace as the
51 : : // template being specialized. See http://stackoverflow.com/a/3052604.
52 : :
53 : : // RNGTest's InputDeck actions
54 : :
55 : : //! Rule used to trigger action
56 : : template< class Option, typename... tags >
57 : : struct store_rngtest_option : pegtl::success {};
58 : : //! \brief Put option in state at position given by tags
59 : : //! \details This is simply a wrapper around tk::grm::store_option passing the
60 : : //! stack defaults for rngtest.
61 : : template< class Option, typename... tags >
62 : : struct action< store_rngtest_option< Option, tags... > > {
63 : : template< typename Input, typename Stack >
64 : 4 : static void apply( const Input& in, Stack& stack ) {
65 : : store_option< Stack, rngtest::deck::use, Option, rngtest::ctr::InputDeck,
66 : : Input, tags... >
67 : 4 : ( stack, in, rngtest::g_inputdeck_defaults );
68 : 4 : }
69 : : };
70 : :
71 : : } // ::grm
72 : : } // ::tk
73 : :
74 : : namespace rngtest {
75 : :
76 : : //! RNGTest input deck facilitating user input for testing RNGs
77 : : namespace deck {
78 : :
79 : : using namespace tao;
80 : :
81 : : // RNGTest's InputDeck grammar
82 : :
83 : : //! \brief Match the inside of rngs ... end block
84 : : struct rngs :
85 : : pegtl::sor<
86 : : #ifdef HAS_MKL
87 : : tk::mkl::rngs< use,
88 : : tag::selected, tag::rng,
89 : : tag::param, tag::rngmkl >,
90 : : #endif
91 : : #ifdef HAS_RNGSSE2
92 : : tk::rngsse::rngs< use,
93 : : tag::selected, tag::rng,
94 : : tag::param, tag::rngsse >,
95 : : #endif
96 : : tk::random123::rngs< use,
97 : : tag::selected, tag::rng,
98 : : tag::param, tag::rng123 > > {};
99 : :
100 : : // \brief Match TestU01 batteries
101 : : template< typename battery_kw >
102 : : struct testu01 :
103 : : pegtl::if_must<
104 : : tk::grm::scan< typename battery_kw::pegtl_string,
105 : : tk::grm::store_rngtest_option< ctr::Battery,
106 : : tag::selected,
107 : : tag::battery > >,
108 : : pegtl::sor< tk::grm::block< use< kw::end >, rngs >,
109 : : tk::grm::msg< tk::grm::MsgType::ERROR,
110 : : tk::grm::MsgKey::UNFINISHED > > > {};
111 : :
112 : : //! \brief Match all batteries
113 : : struct battery :
114 : : pegtl::sor< testu01< use< kw::smallcrush > >,
115 : : testu01< use< kw::crush > >,
116 : : testu01< use< kw::bigcrush > > > {};
117 : :
118 : : //! \brief All keywords
119 : : struct keywords :
120 : : pegtl::sor< tk::grm::title< use >, battery > {};
121 : :
122 : : //! \brief Grammar entry point: parse keywords and ignores until eof
123 : : struct read_file :
124 : : tk::grm::read_file< keywords, tk::grm::ignore > {};
125 : :
126 : : } // deck::
127 : : } // rngtest::
128 : :
129 : : #endif // RNGTestInputDeckGrammar_h
|