diff --git a/modcc/parser.cpp b/modcc/parser.cpp index 75bf1a5750beb5609ca6129f19814dcec9788b1d..965e4946e38a977d25b31ce08eb82b21b2c4fc15 100644 --- a/modcc/parser.cpp +++ b/modcc/parser.cpp @@ -1008,6 +1008,8 @@ expression_ptr Parser::parse_statement() { return parse_solve(); case tok::local: return parse_local(); + case tok::watch: + return parse_watch(); case tok::identifier: return parse_line_expression(); case tok::conserve: @@ -1399,6 +1401,7 @@ expression_ptr Parser::parse_unaryop() { /// expects one of : /// :: number /// :: identifier +/// :: watch /// :: call /// :: parenthesis expression (parsed recursively) /// :: prefix binary operators @@ -1656,6 +1659,19 @@ conductance_statement_error: return nullptr; } +// WATCH (cond) flag +expression_ptr Parser::parse_watch() { + Location loc = location_; // solve location for expression + get_token(); // consume keyword + + parse_parenthesis_expression(); + parse_expression(); + + error("WATCH statements are not supported in modcc.", loc); + return nullptr; +} + + expression_ptr Parser::parse_if() { Token if_token = token_; get_token(); // consume 'if' diff --git a/modcc/parser.hpp b/modcc/parser.hpp index 84e56316c0acb4dc001c6bf42756912e38d60092..bf82af8d9646cf081370972ab213988193b62518 100644 --- a/modcc/parser.hpp +++ b/modcc/parser.hpp @@ -36,6 +36,7 @@ public: expression_ptr parse_local(); expression_ptr parse_solve(); expression_ptr parse_conductance(); + expression_ptr parse_watch(); expression_ptr parse_block(bool); expression_ptr parse_initial(); expression_ptr parse_compartment_statement(); diff --git a/modcc/token.cpp b/modcc/token.cpp index 7ba2f71b9ba508c55e9e5b5dc73416e1d22e5227..db338d169ec118c7a9a01bb864d0b8ed5fec8c73 100644 --- a/modcc/token.cpp +++ b/modcc/token.cpp @@ -74,6 +74,7 @@ static Keyword keywords[] = { {"exprelr", tok::exprelr}, {"safeinv", tok::safeinv}, {"CONDUCTANCE", tok::conductance}, + {"WATCH", tok::watch}, {nullptr, tok::reserved}, }; @@ -152,6 +153,7 @@ static TokenString token_strings[] = { {"sin", tok::sin}, {"cnexp", tok::cnexp}, {"CONDUCTANCE", tok::conductance}, + {"WATCH", tok::watch}, {"error", tok::reserved}, }; diff --git a/modcc/token.hpp b/modcc/token.hpp index 0e09c385b3b323d4e3d2df6c9de225dd5621ea98..a953ae2e56a96b98ed22e35ec78fa848b33560f2 100644 --- a/modcc/token.hpp +++ b/modcc/token.hpp @@ -83,6 +83,9 @@ enum class tok { conductance, + // trap unsupported keywords + watch, + reserved, // placeholder for generating keyword lookup }; diff --git a/test/unit-modcc/test_parser.cpp b/test/unit-modcc/test_parser.cpp index 5916704cea23a602699877473a2aecdafc2fba05..18d3e19c1864efb9e538ff26b17aaa3896ac36d5 100644 --- a/test/unit-modcc/test_parser.cpp +++ b/test/unit-modcc/test_parser.cpp @@ -279,6 +279,10 @@ TEST(Parser, parse_conductance) { } } +TEST(Parser, parse_watch) { + EXPECT_TRUE(check_parse_fail(&Parser::parse_watch, "WATCH( 0 < 1) 42")); +} + TEST(Parser, parse_if) { std::unique_ptr<IfExpression> s;