UPLC data parsing support by CBOR notation (#37)

* Implement constant data parsing support

New notation: (con data #0000)
Where #0000 is the CBOR hex representation of a PlutusDatum

* Add pretty printing support for data

* Format
This commit is contained in:
Niels Mündler 2022-09-08 22:10:12 +02:00 committed by GitHub
parent db5695a1c4
commit 739f38beac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 0 deletions

View File

@ -6,6 +6,7 @@ use crate::{
}; };
use interner::Interner; use interner::Interner;
use pallas_primitives::{alonzo::PlutusData, Fragment};
use peg::{error::ParseError, str::LineCol}; use peg::{error::ParseError, str::LineCol};
mod interner; mod interner;
@ -53,6 +54,7 @@ peg::parser! {
/ constant_string() / constant_string()
/ constant_unit() / constant_unit()
/ constant_bool() / constant_bool()
/ constant_data()
) _* ")" { ) _* ")" {
Term::Constant(con) Term::Constant(con)
} }
@ -110,6 +112,15 @@ peg::parser! {
rule number() -> isize rule number() -> isize
= n:$("-"* ['0'..='9']+) {? n.parse().or(Err("isize")) } = n:$("-"* ['0'..='9']+) {? n.parse().or(Err("isize")) }
rule constant_data() -> Constant
= "data" _+ "#" i:ident()* {
Constant::Data(
PlutusData::decode_fragment(
hex::decode(String::from_iter(i)).unwrap().as_slice()
).unwrap()
)
}
rule name() -> Name rule name() -> Name
= text:ident() { Name { text, unique: 0.into() } } = text:ident() { Name { text, unique: 0.into() } }