diff --git a/include/xo/reader2/DExpectFormalArgSsm.hpp b/include/xo/reader2/DExpectFormalArgSsm.hpp index 1860853c..2ec63834 100644 --- a/include/xo/reader2/DExpectFormalArgSsm.hpp +++ b/include/xo/reader2/DExpectFormalArgSsm.hpp @@ -140,8 +140,10 @@ namespace xo { /** formal parameter name **/ const DUniqueString * name_ = nullptr; +#ifdef NOT_YET /** formal parameter type (if specified) **/ TypeDescr td_ = nullptr; +#endif }; } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/DExpectFormalArgSsm.cpp b/src/reader2/DExpectFormalArgSsm.cpp index 2a19ce62..ad63fa5d 100644 --- a/src/reader2/DExpectFormalArgSsm.cpp +++ b/src/reader2/DExpectFormalArgSsm.cpp @@ -146,6 +146,12 @@ namespace xo { DExpectFormalArgSsm::on_parsed_symbol(std::string_view sym, ParserStateMachine * p_psm) { + if (fstate_ == formalstatetype::formal_0) { + this->fstate_ = formalstatetype::formal_1; + this->name_ = p_psm->intern_string(sym); + return; + } + p_psm->illegal_input_on_symbol("DExpectFormalArgSsm::on_parsed_symbol", sym, this->get_expect_str()); @@ -230,9 +236,18 @@ namespace xo { bool DExpectFormalArgSsm::pretty(const ppindentinfo & ppii) const { - return ppii.pps()->pretty_struct - (ppii, - "DExpectFormalArgSsm"); + if (name_) { + return ppii.pps()->pretty_struct + (ppii, + "DExpectFormalArgSsm", + refrtag("fstate", fstate_), + refrtag("name", std::string_view(*name_))); + } else { + return ppii.pps()->pretty_struct + (ppii, + "DExpectFormalArgSsm", + refrtag("fstate", fstate_)); + } } } /*namespace scm*/ diff --git a/utest/SchematikaParser.test.cpp b/utest/SchematikaParser.test.cpp index 0a3ae658..934b26ed 100644 --- a/utest/SchematikaParser.test.cpp +++ b/utest/SchematikaParser.test.cpp @@ -215,7 +215,7 @@ namespace xo { /** Walkthrough parsing input equivalent to: * - * lambda ; + * lambda (n : i64; * **/ @@ -243,11 +243,10 @@ namespace xo { REQUIRE(result.is_incomplete()); } -#ifdef NOT_YET { - auto & result = parser.on_token(Token::then_token()); + auto & result = parser.on_token(Token::symbol_token("n")); - log && log("after then token:"); + log && log("after symbol(n) token:"); log && log(xtag("parser", &parser)); log && log(xtag("result", result)); @@ -256,6 +255,31 @@ namespace xo { REQUIRE(result.is_incomplete()); } + { + auto & result = parser.on_token(Token::colon_token()); + + log && log("after colon token:"); + log && log(xtag("parser", &parser)); + log && log(xtag("result", result)); + + REQUIRE(parser.has_incomplete_expr() == true); + REQUIRE(!result.is_error()); + REQUIRE(result.is_incomplete()); + } + + { + auto & result = parser.on_token(Token::symbol_token("i64")); + + log && log("after symbol(i64) token:"); + log && log(xtag("parser", &parser)); + log && log(xtag("result", result)); + + REQUIRE(parser.has_incomplete_expr() == true); + REQUIRE(!result.is_error()); + REQUIRE(result.is_incomplete()); + } + +#ifdef NOT_YET { auto & result = parser.on_token(Token::i64_token("777"));