| 149 | } |
| 150 | |
| 151 | unique_ptr<iHdlExprItem> VerExprParser::visitExpression( |
| 152 | sv2017Parser::ExpressionContext *ctx) { |
| 153 | // expression: |
| 154 | // primary |
| 155 | // | LPAREN operator_assignment RPAREN |
| 156 | // | KW_TAGGED identifier ( expression )? |
| 157 | // | unary_operator ( attribute_instance )* primary |
| 158 | // | inc_or_dec_expression |
| 159 | // | expression DOUBLESTAR ( attribute_instance )* expression |
| 160 | // | expression operator_mul_div_mod ( attribute_instance )* expression |
| 161 | // | expression operator_plus_minus ( attribute_instance )* expression |
| 162 | // | expression operator_shift ( attribute_instance )* expression |
| 163 | // | expression operator_cmp ( attribute_instance )* expression |
| 164 | // | expression KW_INSIDE LBRACE open_range_list RBRACE |
| 165 | // | expression operator_eq_neq ( attribute_instance )* expression |
| 166 | // | expression AMPERSAND ( attribute_instance )* expression |
| 167 | // | expression operator_xor ( attribute_instance )* expression |
| 168 | // | expression BAR ( attribute_instance )* expression |
| 169 | // | expression AND_LOG ( attribute_instance )* expression |
| 170 | // | expression OR_LOG ( attribute_instance )* expression |
| 171 | // | expression ( KW_MATCHES pattern )? TRIPLE_AND expression ( KW_MATCHES pattern )? |
| 172 | // | expression ( KW_MATCHES pattern )? (QUESTIONMARK ( attribute_instance )* expression COLON expression)+ // right associative |
| 173 | // | expression (operator_impl ( attribute_instance )* expression)+ // right associative |
| 174 | // ; |
| 175 | |
| 176 | auto oa = ctx->operator_assignment(); |
| 177 | if (oa) { |
| 178 | NotImplementedLogger::print( |
| 179 | "VerExprParser.visitExpression.operator_assignment", ctx); |
| 180 | return create_object<HdlExprNotImplemented>(ctx); |
| 181 | } |
| 182 | if (ctx->KW_TAGGED()) { |
| 183 | NotImplementedLogger::print( |
| 184 | "VerExprParser.visitExpression.KW_TAGGED identifier", ctx); |
| 185 | return create_object<HdlExprNotImplemented>(ctx); |
| 186 | } |
| 187 | |
| 188 | for (auto ai : ctx->attribute_instance()) { |
| 189 | VerAttributeParser::visitAttribute_instance(ai); |
| 190 | } |
| 191 | |
| 192 | auto _p = ctx->primary(); |
| 193 | if (_p) { |
| 194 | VerExprPrimaryParser pp(this); |
| 195 | auto p = pp.visitPrimary(_p); |
| 196 | auto _uo = ctx->unary_operator(); |
| 197 | if (_uo) { |
| 198 | auto uo = VerLiteralParser::visitUnary_operator(_uo); |
| 199 | assert(_p); |
| 200 | return create_object<HdlOp>(_uo, uo, move(p)); |
| 201 | } else { |
| 202 | return p; |
| 203 | } |
| 204 | } |
| 205 | auto ide = ctx->inc_or_dec_expression(); |
| 206 | if (ide) { |
| 207 | return visitInc_or_dec_expression(ide); |
| 208 | } |
no test coverage detected