fix: builtin parsing

This commit is contained in:
Kasey White 2022-05-10 23:58:37 -04:00
parent 7f4f103adc
commit e0e98f92e4
5 changed files with 87 additions and 82 deletions

View File

@ -1,3 +1,3 @@
(program 1.0.0 (program 1.0.0
[(lam x (con integer 4)) (con bool False)] [[(builtin addInteger) (con integer 4)] (con integer 8)]
) )

View File

@ -1,4 +1,4 @@
use strum_macros::EnumString; use crate::builtins::DefaultFunction;
#[derive(Debug)] #[derive(Debug)]
pub struct Program { pub struct Program {
@ -27,7 +27,7 @@ pub enum Term {
// tag: 5 // tag: 5
Force(Box<Term>), Force(Box<Term>),
// tag: 6 // tag: 6
Error(Box<Term>), Error,
// tag: 7 // tag: 7
Builtin(DefaultFunction), Builtin(DefaultFunction),
} }
@ -48,79 +48,3 @@ pub enum Constant {
// tag: 5 // tag: 5
Bool(bool), Bool(bool),
} }
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, EnumString)]
pub enum DefaultFunction {
// Integer functions
AddInteger,
SubtractInteger,
MultiplyInteger,
DivideInteger,
QuotientInteger,
RemainderInteger,
ModInteger,
EqualsInteger,
LessThanInteger,
LessThanEqualsInteger,
// ByteString functions
AppendByteString,
ConsByteString,
SliceByteString,
LengthOfByteString,
IndexByteString,
EqualsByteString,
LessThanByteString,
LessThanEqualsByteString,
// Cryptography and hash functions
Sha2_256,
Sha3_256,
Blake2b_256,
VerifySignature,
VerifyEcdsaSecp256k1Signature,
VerifySchnorrSecp256k1Signature,
// String functions
AppendString,
EqualsString,
EncodeUtf8,
DecodeUtf8,
// Bool function
IfThenElse,
// Unit function
ChooseUnit,
// Tracing function
Trace,
// Pairs functions
FstPair,
SndPair,
// List functions
ChooseList,
MkCons,
HeadList,
TailList,
NullList,
// Data functions
// It is convenient to have a "choosing" function for a data type that has more than two
// constructors to get pattern matching over it and we may end up having multiple such data
// types, hence we include the name of the data type as a suffix.
ChooseData,
ConstrData,
MapData,
ListData,
IData,
BData,
UnConstrData,
UnMapData,
UnListData,
UnIData,
UnBData,
EqualsData,
SerialiseData,
// Misc constructors
// Constructors that we need for constructing e.g. Data. Polymorphic builtin
// constructors are often problematic (See note [Representable built-in
// functions over polymorphic built-in types])
MkPairData,
MkNilData,
MkNilPairData,
}

78
src/builtins.rs Normal file
View File

@ -0,0 +1,78 @@
use strum_macros::EnumString;
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, EnumString)]
#[strum(serialize_all = "camelCase")]
pub enum DefaultFunction {
// Integer functions
AddInteger,
SubtractInteger,
MultiplyInteger,
DivideInteger,
QuotientInteger,
RemainderInteger,
ModInteger,
EqualsInteger,
LessThanInteger,
LessThanEqualsInteger,
// ByteString functions
AppendByteString,
ConsByteString,
SliceByteString,
LengthOfByteString,
IndexByteString,
EqualsByteString,
LessThanByteString,
LessThanEqualsByteString,
// Cryptography and hash functions
Sha2_256,
Sha3_256,
Blake2b_256,
VerifySignature,
VerifyEcdsaSecp256k1Signature,
VerifySchnorrSecp256k1Signature,
// String functions
AppendString,
EqualsString,
EncodeUtf8,
DecodeUtf8,
// Bool function
IfThenElse,
// Unit function
ChooseUnit,
// Tracing function
Trace,
// Pairs functions
FstPair,
SndPair,
// List functions
ChooseList,
MkCons,
HeadList,
TailList,
NullList,
// Data functions
// It is convenient to have a "choosing" function for a data type that has more than two
// constructors to get pattern matching over it and we may end up having multiple such data
// types, hence we include the name of the data type as a suffix.
ChooseData,
ConstrData,
MapData,
ListData,
IData,
BData,
UnConstrData,
UnMapData,
UnListData,
UnIData,
UnBData,
EqualsData,
SerialiseData,
// Misc constructors
// Constructors that we need for constructing e.g. Data. Polymorphic builtin
// constructors are often problematic (See note [Representable built-in
// functions over polymorphic built-in types])
MkPairData,
MkNilData,
MkNilPairData,
}

View File

@ -1,4 +1,5 @@
pub mod ast; pub mod ast;
pub mod builtins;
pub mod cli; pub mod cli;
pub mod parser; pub mod parser;

View File

@ -8,7 +8,10 @@ use combine::{
token, EasyParser, ParseError, Parser, Stream, token, EasyParser, ParseError, Parser, Stream,
}; };
use crate::ast::{Constant, DefaultFunction, Program, Term}; use crate::{
ast::{Constant, Program, Term},
builtins::DefaultFunction,
};
pub fn program(src: &str) -> anyhow::Result<Program> { pub fn program(src: &str) -> anyhow::Result<Program> {
let mut parser = program_(); let mut parser = program_();
@ -167,8 +170,7 @@ where
token(')'), token(')'),
string("error") string("error")
.with(skip_many1(space())) .with(skip_many1(space()))
.with(term_()) .map(|_| Term::Error),
.map(|term| Term::Error(Box::new(term))),
) )
} }