| 173 | } |
| 174 | |
| 175 | unique_ptr<iHdlExprItem> VhdlExprParser::visitSimple_expression( |
| 176 | vhdlParser::Simple_expressionContext *ctx) { |
| 177 | // simple_expression: |
| 178 | // primary ( DOUBLESTAR primary )? |
| 179 | // | ( KW_ABS | KW_NOT | logical_operator | sign ) simple_expression |
| 180 | // | simple_expression multiplying_operator simple_expression |
| 181 | // | simple_expression adding_operator simple_expression |
| 182 | // ; |
| 183 | auto _primary = ctx->primary(); |
| 184 | if (_primary.size() == 1) { |
| 185 | return visitPrimary(_primary[0]); |
| 186 | } else if (_primary.size() == 2) { |
| 187 | auto p0 = visitPrimary(_primary[0]); |
| 188 | aggregate_to_parenthesis(p0); |
| 189 | auto p1 = visitPrimary(_primary[1]); |
| 190 | aggregate_to_parenthesis(p1); |
| 191 | assert(ctx->DOUBLESTAR()); |
| 192 | return create_object<HdlOp>(ctx, move(p0), HdlOpType::POW, |
| 193 | move(p1)); |
| 194 | } |
| 195 | auto se = ctx->simple_expression(); |
| 196 | HdlOpType op; |
| 197 | if (se.size() == 1) { |
| 198 | if (ctx->KW_ABS()) { |
| 199 | op = HdlOpType::ABS; |
| 200 | } else if (ctx->KW_NOT()) { |
| 201 | op = HdlOpType::NEG; |
| 202 | } else { |
| 203 | auto lo = ctx->logical_operator(); |
| 204 | if (lo) { |
| 205 | op = HdlOpType_from(lo); |
| 206 | } else { |
| 207 | auto s = ctx->sign(); |
| 208 | assert(s); |
| 209 | op = HdlOpType_from(s); |
| 210 | } |
| 211 | op = HdlOpType_toUnary(op); |
| 212 | } |
| 213 | auto se0 = visitSimple_expression(se[0]); |
| 214 | aggregate_to_parenthesis(se0); |
| 215 | return create_object<HdlOp>(ctx, op, move(se0)); |
| 216 | } else { |
| 217 | assert(se.size() == 2); |
| 218 | auto mo = ctx->multiplying_operator(); |
| 219 | if (mo) { |
| 220 | op = HdlOpType_from(mo); |
| 221 | } else { |
| 222 | auto ao = ctx->adding_operator(); |
| 223 | assert(ao); |
| 224 | op = HdlOpType_from(ao); |
| 225 | } |
| 226 | |
| 227 | auto se0 = visitSimple_expression(se[0]); |
| 228 | aggregate_to_parenthesis(se0); |
| 229 | auto se1 = visitSimple_expression(se[1]); |
| 230 | aggregate_to_parenthesis(se1); |
| 231 | return create_object<HdlOp>(ctx, move(se0), op, move(se1)); |
| 232 | } |
nothing calls this directly
no test coverage detected