ajust/add devlaration errors to be more standard compliant

This commit is contained in:
Bennet Bleßmann
2024-08-03 22:59:29 +02:00
parent 17a816eff4
commit df33da111e
9 changed files with 86 additions and 3 deletions

View File

@@ -268,6 +268,26 @@ impl DomainError for HeapCellValue {
} }
} }
impl DomainError for FunctorStub {
fn domain_error(
self,
machine_st: &mut MachineState,
valid_type: DomainErrorType,
) -> MachineError {
let stub = functor!(
atom!("domain_error"),
[atom(valid_type.as_atom()), str(machine_st.heap.len(), 0)],
[self]
);
MachineError {
stub,
location: None,
from: ErrorProvenance::Constructed,
}
}
}
impl DomainError for Number { impl DomainError for Number {
fn domain_error(self, machine_st: &mut MachineState, error: DomainErrorType) -> MachineError { fn domain_error(self, machine_st: &mut MachineState, error: DomainErrorType) -> MachineError {
let stub = functor!( let stub = functor!(
@@ -731,6 +751,8 @@ pub enum DeclarationError {
InvalidOpDeclSpecValue(Atom), InvalidOpDeclSpecValue(Atom),
InvalidOpDeclPrecType(Term), InvalidOpDeclPrecType(Term),
InvalidOpDeclPrecDomain(Fixnum), InvalidOpDeclPrecDomain(Fixnum),
ShallNotCreate(Atom),
ShallNotModify(Atom),
} }
impl From<ArithmeticError> for CompilationError { impl From<ArithmeticError> for CompilationError {
@@ -844,6 +866,7 @@ pub(crate) enum DomainErrorType {
StreamOrAlias, StreamOrAlias,
OperatorSpecifier, OperatorSpecifier,
OperatorPriority, OperatorPriority,
Declaration,
} }
impl DomainErrorType { impl DomainErrorType {
@@ -857,6 +880,7 @@ impl DomainErrorType {
DomainErrorType::StreamOrAlias => atom!("stream_or_alias"), DomainErrorType::StreamOrAlias => atom!("stream_or_alias"),
DomainErrorType::OperatorSpecifier => atom!("operator_specifier"), DomainErrorType::OperatorSpecifier => atom!("operator_specifier"),
DomainErrorType::OperatorPriority => atom!("operator_priority"), DomainErrorType::OperatorPriority => atom!("operator_priority"),
DomainErrorType::Declaration => atom!("declaration"),
} }
} }
} }

View File

@@ -986,7 +986,7 @@ impl MachineState {
atom_as_cell!(atom!("todo_insert_invalid_term_here")), atom_as_cell!(atom!("todo_insert_invalid_term_here")),
), ),
DeclarationError::InvalidDecl(name, arity) => { DeclarationError::InvalidDecl(name, arity) => {
self.existence_error(ExistenceError::Declaration(name, arity)) self.domain_error(DomainErrorType::Declaration, functor_stub(name, arity))
} }
DeclarationError::InvalidOpDeclNameType(_term) => self.type_error( DeclarationError::InvalidOpDeclNameType(_term) => self.type_error(
ValidType::List, ValidType::List,
@@ -1006,6 +1006,12 @@ impl MachineState {
DeclarationError::InvalidOpDeclPrecDomain(num) => { DeclarationError::InvalidOpDeclPrecDomain(num) => {
self.domain_error(DomainErrorType::OperatorPriority, fixnum_as_cell!(num)) self.domain_error(DomainErrorType::OperatorPriority, fixnum_as_cell!(num))
} }
DeclarationError::ShallNotCreate(atom) => {
self.permission_error(Permission::Create, atom!("operator"), atom)
}
DeclarationError::ShallNotModify(atom) => {
self.permission_error(Permission::Modify, atom!("operator"), atom)
}
} }
} }
} }

View File

@@ -60,6 +60,24 @@ fn setup_op_decl(mut terms: Vec<Term>, atom_tbl: &AtomTable) -> Result<OpDecl, C
} }
}; };
if name == "[]" || name == "{}" {
return Err(CompilationError::InvalidDecl(
DeclarationError::ShallNotCreate(name),
));
}
if name == "," {
return Err(CompilationError::InvalidDecl(
DeclarationError::ShallNotModify(name),
));
}
if name == "|" && (prec < 1001 || !spec.is_infix()) {
return Err(CompilationError::InvalidDecl(
DeclarationError::ShallNotCreate(name),
));
}
Ok(to_op_decl(prec, spec, name)) Ok(to_op_decl(prec, spec, name))
} }

View File

@@ -0,0 +1 @@
:- op(500, xfy, {}).

View File

@@ -0,0 +1 @@
:- op(500, xfy, [{}]).

View File

@@ -0,0 +1 @@
:- op(1000, xfy, '|').

View File

@@ -0,0 +1 @@
:- op(1150, fx, '|').

View File

@@ -0,0 +1 @@
:- op(500, yfx, ',').

View File

@@ -18,13 +18,13 @@ $ scryer-prolog -f --no-add-history tests-pl/invalid_decl3.pl -g halt
```trycmd ```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl4.pl -g halt $ scryer-prolog -f --no-add-history tests-pl/invalid_decl4.pl -g halt
error(existence_error(declaration,op/4),load/1). error(domain_error(declaration,op/4),load/1).
``` ```
```trycmd ```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl5.pl -g halt $ scryer-prolog -f --no-add-history tests-pl/invalid_decl5.pl -g halt
error(existence_error(declaration,(;)/2),load/1). error(domain_error(declaration,(;)/2),load/1).
``` ```
@@ -66,3 +66,33 @@ The following test doesn't appear to terminate so its moved to a block quote for
> % Warning: singleton variables Var at line 0 of invalid_decl11.pl > % Warning: singleton variables Var at line 0 of invalid_decl11.pl
> error(instantiation_error,load/1). > error(instantiation_error,load/1).
> ``` > ```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl12.pl -g halt
error(permission_error(create,operator,{}),load/1).
```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl13.pl -g halt
error(permission_error(create,operator,{}),load/1).
```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl14.pl -g halt
error(permission_error(create,operator,'|'),load/1).
```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl15.pl -g halt
error(permission_error(create,operator,'|'),load/1).
```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl16.pl -g halt
error(permission_error(modify,operator,','),load/1).
```