MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / parse_spec_expr

Method parse_spec_expr

cranelift/isle/isle/src/parser.rs:449–507  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

447 }
448
449 fn parse_spec_expr(&mut self) -> Result<SpecExpr> {
450 let pos = self.pos();
451 if self.is_spec_bit_vector() {
452 let (val, width) = self.parse_spec_bit_vector()?;
453 return Ok(SpecExpr::ConstBitVec { val, width, pos });
454 } else if self.is_int() {
455 return Ok(SpecExpr::ConstInt {
456 val: self.expect_int()?,
457 pos,
458 });
459 } else if self.is_spec_bool() {
460 let val = self.parse_spec_bool()?;
461 return Ok(SpecExpr::ConstBool { val, pos });
462 } else if self.is_sym() {
463 let var = self.parse_ident()?;
464 return Ok(SpecExpr::Var { var, pos });
465 } else if self.is_lparen() {
466 self.expect_lparen()?;
467 if self.eat_sym_str("switch")? {
468 let mut args = vec![];
469 args.push(self.parse_spec_expr()?);
470 while !(self.is_rparen()) {
471 self.expect_lparen()?;
472 let l = Box::new(self.parse_spec_expr()?);
473 let r = Box::new(self.parse_spec_expr()?);
474 self.expect_rparen()?;
475 args.push(SpecExpr::Pair { l, r });
476 }
477 self.expect_rparen()?;
478 return Ok(SpecExpr::Op {
479 op: SpecOp::Switch,
480 args,
481 pos,
482 });
483 }
484 if self.is_sym() && !self.is_spec_bit_vector() {
485 let sym = self.expect_symbol()?;
486 if let Ok(op) = self.parse_spec_op(sym.as_str()) {
487 let mut args: Vec<SpecExpr> = vec![];
488 while !self.is_rparen() {
489 args.push(self.parse_spec_expr()?);
490 }
491 self.expect_rparen()?;
492 return Ok(SpecExpr::Op { op, args, pos });
493 };
494 let ident = self.str_to_ident(pos, &sym)?;
495 if self.is_rparen() {
496 self.expect_rparen()?;
497 return Ok(SpecExpr::Enum { name: ident });
498 };
499 }
500 // Unit
501 if self.is_rparen() {
502 self.expect_rparen()?;
503 return Ok(SpecExpr::ConstUnit { pos });
504 }
505 }
506 Err(self.error(pos, "Unexpected spec expression".into()))

Callers 2

parse_specMethod · 0.80
parse_modelMethod · 0.80

Calls 15

OkFunction · 0.85
is_spec_bit_vectorMethod · 0.80
parse_spec_bit_vectorMethod · 0.80
expect_intMethod · 0.80
is_spec_boolMethod · 0.80
parse_spec_boolMethod · 0.80
parse_identMethod · 0.80
is_lparenMethod · 0.80
expect_lparenMethod · 0.80
eat_sym_strMethod · 0.80
is_rparenMethod · 0.80
expect_rparenMethod · 0.80

Tested by

no test coverage detected