mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 20:34:44 +00:00
Add and
, or
type parsing
This commit is contained in:
parent
05c434781b
commit
a4f0ad4024
2 changed files with 23 additions and 3 deletions
|
@ -366,7 +366,7 @@ impl Context {
|
|||
/// assert supertype_of(Bool, Bool)
|
||||
/// ```
|
||||
/// This function does not consider the nominal subtype relation.
|
||||
/// Use `rec_full_supertype_of` for complete judgement.
|
||||
/// Use `supertype_of` for complete judgement.
|
||||
/// 単一化、評価等はここでは行わない、スーパータイプになる可能性があるかだけ判定する
|
||||
/// ので、lhsが(未連携)型変数の場合は単一化せずにtrueを返す
|
||||
pub(crate) fn structural_supertype_of(&self, lhs: &Type, rhs: &Type) -> bool {
|
||||
|
|
|
@ -2121,8 +2121,8 @@ impl Parser {
|
|||
Ok(bounds)
|
||||
}
|
||||
|
||||
fn convert_type_arg_to_bound(&mut self, _arg: PosArg) -> ParseResult<TypeBoundSpec> {
|
||||
match _arg.expr {
|
||||
fn convert_type_arg_to_bound(&mut self, arg: PosArg) -> ParseResult<TypeBoundSpec> {
|
||||
match arg.expr {
|
||||
Expr::TypeAsc(tasc) => {
|
||||
let lhs = self
|
||||
.convert_rhs_to_sig(*tasc.expr)
|
||||
|
@ -2529,6 +2529,26 @@ impl Parser {
|
|||
.map_err(|_| self.stack_dec())?;
|
||||
self.level -= 1;
|
||||
Ok(TypeSpec::Interval { op, lhs, rhs })
|
||||
} else if bin.op.kind == TokenKind::AndOp {
|
||||
let mut args = bin.args.into_iter();
|
||||
let lhs = self
|
||||
.convert_rhs_to_type_spec(*args.next().unwrap())
|
||||
.map_err(|_| self.stack_dec())?;
|
||||
let rhs = self
|
||||
.convert_rhs_to_type_spec(*args.next().unwrap())
|
||||
.map_err(|_| self.stack_dec())?;
|
||||
self.level -= 1;
|
||||
Ok(TypeSpec::and(lhs, rhs))
|
||||
} else if bin.op.kind == TokenKind::OrOp {
|
||||
let mut args = bin.args.into_iter();
|
||||
let lhs = self
|
||||
.convert_rhs_to_type_spec(*args.next().unwrap())
|
||||
.map_err(|_| self.stack_dec())?;
|
||||
let rhs = self
|
||||
.convert_rhs_to_type_spec(*args.next().unwrap())
|
||||
.map_err(|_| self.stack_dec())?;
|
||||
self.level -= 1;
|
||||
Ok(TypeSpec::or(lhs, rhs))
|
||||
} else {
|
||||
self.level -= 1;
|
||||
let err = ParseError::simple_syntax_error(line!() as usize, bin.loc());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue