xo-reader2: + DDefineSsm + utest
This commit is contained in:
parent
39fa1f7c9f
commit
d3066ef88d
13 changed files with 762 additions and 3 deletions
97
xo-reader2/include/xo/reader2/DDefineSsm.hpp
Normal file
97
xo-reader2/include/xo/reader2/DDefineSsm.hpp
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/** @file DDefineSsm.hpp
|
||||
*
|
||||
* @author Roland Conybeare, Jan 2026
|
||||
**/
|
||||
|
||||
#include "ParserStateMachine.hpp"
|
||||
#include "SyntaxStateMachine.hpp"
|
||||
#include "syntaxstatetype.hpp"
|
||||
#include <xo/facet/obj.hpp>
|
||||
|
||||
namespace xo {
|
||||
namespace scm {
|
||||
/**
|
||||
* @pre
|
||||
*
|
||||
* def foo : f64 = 1 ;
|
||||
* ^ ^ ^ ^ ^ ^ ^ ^
|
||||
* | | | | | | | (done)
|
||||
* | | | | | | def_6:expect_rhs_expression:expr_progress
|
||||
* | | | | | def_5:expect_rhs_expression
|
||||
* | | | | def_4
|
||||
* | | | def_3:expect_type
|
||||
* | | def_2
|
||||
* | def_1:expect_symbol
|
||||
* def_0
|
||||
* expect_toplevel_expression_sequence
|
||||
*
|
||||
* def_0 --on_def_token()--> def_1
|
||||
* def_1 --on_symbol()--> def_2
|
||||
* def_2 --on_colon_token()--> def_3
|
||||
* --on_singleassign_token()--> def_5
|
||||
* def_3 --on_typedescr()--> def_4
|
||||
* def_4 --on_singleassign_token()--> def_5
|
||||
* def_5 --on_expr()--> def_6
|
||||
* def_6 --on_semicolon_token()--> (done)
|
||||
*
|
||||
* def_1:expect_symbol: got 'def' keyword, symbol to follow
|
||||
* def_1: got symbol name
|
||||
* def_3:expect_symbol got (optional) colon, type name to follow
|
||||
* def_4: got symbol type
|
||||
* def_6:expect_rhs_expression got (optional) equal sign, value to follow
|
||||
* (done): definition complete, pop exprstate from stack
|
||||
*
|
||||
* @endpre
|
||||
**/
|
||||
enum class defexprstatetype {
|
||||
invalid = -1,
|
||||
|
||||
def_0,
|
||||
def_1,
|
||||
def_2,
|
||||
def_3,
|
||||
def_4,
|
||||
def_5,
|
||||
def_6,
|
||||
|
||||
n_defexprstatetype,
|
||||
};
|
||||
|
||||
extern const char * defexprstatetype_descr(defexprstatetype x);
|
||||
|
||||
std::ostream &
|
||||
operator<<(std::ostream & os, defexprstatetype x);
|
||||
|
||||
/** @class DDefineSsm
|
||||
* @brief state machine for parsing a define expression
|
||||
**/
|
||||
class DDefineSsm {
|
||||
public:
|
||||
|
||||
public:
|
||||
/** @defgroup scm-define-ssm-facet syntaxstatemachine facet methods **/
|
||||
///@{
|
||||
|
||||
/** identifies the ssm implemented here **/
|
||||
syntaxstatetype ssm_type() const noexcept;
|
||||
|
||||
/** text describing expected/allowed input to this ssm in current state.
|
||||
* Intended to drive error mesages
|
||||
**/
|
||||
std::string_view get_expect_str() const noexcept;
|
||||
|
||||
/** update state for this syntax on incoming token @p tk,
|
||||
* overall parser state in @p p_psm
|
||||
**/
|
||||
void on_if_token(const Token & tk, ParserStateMachine * p_psm);
|
||||
|
||||
///@}
|
||||
|
||||
private:
|
||||
/** identify define-expression state **/
|
||||
defexprstatetype defstate_;
|
||||
};
|
||||
} /*namespace scm*/
|
||||
} /*namespace xo*/
|
||||
|
||||
/* end DDefineSsm.hpp */
|
||||
|
|
@ -198,7 +198,7 @@ namespace xo {
|
|||
* @return parsed expression, if @p tk completes an expression.
|
||||
* otherwise nullptr
|
||||
**/
|
||||
const ParserResult & include_token(const token_type & tk);
|
||||
const ParserResult & on_token(const token_type & tk);
|
||||
|
||||
/** reset parsed result expression; use using return value from
|
||||
* @ref include_token. Complicating api here to avoid copying ParserResult
|
||||
|
|
|
|||
|
|
@ -0,0 +1,66 @@
|
|||
/** @file ISyntaxStateMachine_DDefineSsm.hpp
|
||||
*
|
||||
* Generated automagically from ingredients:
|
||||
* 1. code generator:
|
||||
* [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet]
|
||||
* arguments:
|
||||
* --input [idl/ISyntaxStateMachine_DDefineSsm.json5]
|
||||
* 2. jinja2 template for abstract facet .hpp file:
|
||||
* [iface_facet_repr.hpp.j2]
|
||||
* 3. idl for facet methods
|
||||
* [idl/ISyntaxStateMachine_DDefineSsm.json5]
|
||||
**/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SyntaxStateMachine.hpp"
|
||||
#include "SyntaxStateMachine.hpp"
|
||||
#include "ssm/ISyntaxStateMachine_Xfer.hpp"
|
||||
#include "DDefineSsm.hpp"
|
||||
|
||||
namespace xo { namespace scm { class ISyntaxStateMachine_DDefineSsm; } }
|
||||
|
||||
namespace xo {
|
||||
namespace facet {
|
||||
template <>
|
||||
struct FacetImplementation<xo::scm::ASyntaxStateMachine,
|
||||
xo::scm::DDefineSsm>
|
||||
{
|
||||
using ImplType = xo::scm::ISyntaxStateMachine_Xfer
|
||||
<xo::scm::DDefineSsm,
|
||||
xo::scm::ISyntaxStateMachine_DDefineSsm>;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
namespace xo {
|
||||
namespace scm {
|
||||
/** @class ISyntaxStateMachine_DDefineSsm
|
||||
**/
|
||||
class ISyntaxStateMachine_DDefineSsm {
|
||||
public:
|
||||
/** @defgroup scm-syntaxstatemachine-ddefinessm-type-traits **/
|
||||
///@{
|
||||
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
|
||||
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
|
||||
///@}
|
||||
/** @defgroup scm-syntaxstatemachine-ddefinessm-methods **/
|
||||
///@{
|
||||
// const methods
|
||||
/** identify a type of syntax state machine **/
|
||||
static syntaxstatetype ssm_type(const DDefineSsm & self) noexcept;
|
||||
/** text describing expected/allowed input to this ssm in current state **/
|
||||
static std::string_view get_expect_str(const DDefineSsm & self) noexcept;
|
||||
|
||||
// non-const methods
|
||||
/** update state machine for incoming define-keyworkd-token @p tk **/
|
||||
static void on_def_token(DDefineSsm & self, const Token & tk, ParserStateMachine * ps_psm);
|
||||
/** update state machine for incoming if-keyword-token @p tk **/
|
||||
static void on_if_token(DDefineSsm & self, const Token & tk, ParserStateMachine * p_psm);
|
||||
///@}
|
||||
};
|
||||
|
||||
} /*namespace scm*/
|
||||
} /*namespace xo*/
|
||||
|
||||
/* end */
|
||||
|
|
@ -21,6 +21,9 @@ namespace xo {
|
|||
/** toplevel of some translation unit. See @ref DExprSeqState **/
|
||||
expect_toplevel_expression_sequence,
|
||||
|
||||
/** handle define-expression. See @ref DDefineSsm **/
|
||||
defexpr,
|
||||
|
||||
/** comes lasts, counts number of valid enums **/
|
||||
N
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue