From a143322f5331ae5a6b2e87d77c369dd51958c8d8 Mon Sep 17 00:00:00 2001 From: howardwu Date: Fri, 13 Mar 2020 10:02:39 -0700 Subject: [PATCH] Working parser --- Cargo.lock | 1123 ++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 + simple.program | 3 +- src/language.pest | 26 +- src/main.rs | 194 ++++---- 5 files changed, 1245 insertions(+), 104 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6de251f875..515ec88034 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,46 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + [[package]] name = "backtrace" version = "0.3.45" @@ -22,6 +63,78 @@ dependencies = [ "libc", ] +[[package]] +name = "base58" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" + +[[package]] +name = "base58-monero" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c25c7705c81e36f14c293e67846819b1fa3ca7c5e9888ebf149c2bd59d06aa" +dependencies = [ + "keccak-hash", +] + +[[package]] +name = "bech32" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58946044516aa9dc922182e0d6e9d124a31aafe6b421614654eb27cf90cec09c" + +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bindgen" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb26d6a69a335b8cb0e7c7e9775cd5666611dc50a37177c3f2cedcfc040e8c8" +dependencies = [ + "bitflags", + "cexpr", + "cfg-if", + "clang-sys", + "clap", + "env_logger", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2 1.0.9", + "quote 1.0.3", + "regex", + "rustc-hash", + "shlex", + "which", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake2" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b77e29dbd0115e43938be2d5128ecf81c0353e00acaa65339a1242586951d9" +dependencies = [ + "byte-tools 0.2.0", + "crypto-mac 0.5.2", + "digest 0.7.6", +] + [[package]] name = "block-buffer" version = "0.7.3" @@ -29,9 +142,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ "block-padding", - "byte-tools", + "byte-tools 0.3.1", "byteorder", - "generic-array", + "generic-array 0.12.3", ] [[package]] @@ -40,9 +153,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ - "byte-tools", + "byte-tools 0.3.1", ] +[[package]] +name = "byte-tools" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" + [[package]] name = "byte-tools" version = "0.3.1" @@ -57,9 +176,21 @@ checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "cc" -version = "1.0.50" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +checksum = "8dae9c4b8fedcae85592ba623c4fd08cfdab3e3b72d6df780c6ead964a69bfff" +dependencies = [ + "rayon", +] + +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -67,13 +198,153 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "clang-sys" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92986241798376849e1a007827041fed9bb36195822c2049d18e174420e0534" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "2.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg 1.0.0", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg 1.0.0", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "crunchy" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0999b4ff4d3446d4ddb19a63e9e00c1876e75cd7000d20e57a693b4b3f08d958" +dependencies = [ + "constant_time_eq", + "generic-array 0.9.0", +] + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.3", + "subtle", +] + +[[package]] +name = "derivative" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6d883546668a3e2011b6a716a7330b82eabb0151b138217f632c8243e17135" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "digest" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" +dependencies = [ + "generic-array 0.9.0", +] + [[package]] name = "digest" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.3", ] [[package]] @@ -82,6 +353,55 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "ethbloom" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6294da962646baa738414e8e718d1a1f0360a51d92de89ccbf91870418f5360" +dependencies = [ + "crunchy 0.1.6", + "ethereum-types-serialize", + "fixed-hash", + "serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e742184dc63a01c8ea0637369f8faa27c40f537949908a237f95c05e68d2c96" +dependencies = [ + "crunchy 0.1.6", + "ethbloom", + "ethereum-types-serialize", + "fixed-hash", + "serde", + "uint", +] + +[[package]] +name = "ethereum-types-serialize" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1873d77b32bc1891a79dad925f2acbc318ee942b38b9110f9dbc5fbeffcea350" +dependencies = [ + "serde", +] + [[package]] name = "failure" version = "0.1.7" @@ -110,6 +430,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "fixed-hash" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7afe6ce860afb14422711595a7b26ada9ed7de2f43c0b2ab79d09ee196287273" +dependencies = [ + "heapsize", + "rand 0.4.6", + "rustc-hex", +] + [[package]] name = "from-pest" version = "0.3.1" @@ -120,6 +451,27 @@ dependencies = [ "void", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futures" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" + +[[package]] +name = "generic-array" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.12.3" @@ -129,6 +481,62 @@ dependencies = [ "typenum", ] +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "heapsize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +dependencies = [ + "winapi", +] + +[[package]] +name = "hermit-abi" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" + +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + [[package]] name = "itertools" version = "0.7.11" @@ -138,6 +546,35 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "jsonrpc-core" +version = "14.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe3b688648f1ef5d5072229e2d672ecb92cbff7d1c79bcf3fd5898f3f3df0970" +dependencies = [ + "futures", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak-hash" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "253bbe643c32c816bf58fa5a88248fafedeebb139705ad17a62add3517854a86" +dependencies = [ + "ethereum-types", + "tiny-keccak", +] + [[package]] name = "language" version = "0.1.0" @@ -147,6 +584,8 @@ dependencies = [ "pest", "pest-ast", "pest_derive", + "snarkos-gadgets", + "snarkos-models", ] [[package]] @@ -155,24 +594,108 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" + [[package]] name = "libc" version = "0.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi", +] + +[[package]] +name = "librocksdb-sys" +version = "6.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3b727e2dd20ec2fb7ed93f23d9fd5328a0871185485ebdaff007b47d3e27e4" +dependencies = [ + "bindgen", + "cc", + "glob", + "libc", +] + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + [[package]] name = "maplit" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "memoffset" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "nom" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "num_cpus" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "opaque-debug" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "pest" version = "2.1.3" @@ -229,6 +752,12 @@ dependencies = [ "sha-1", ] +[[package]] +name = "ppv-lite86" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" + [[package]] name = "proc-macro2" version = "0.4.30" @@ -247,6 +776,12 @@ dependencies = [ "unicode-xid 0.2.0", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "0.6.13" @@ -265,12 +800,339 @@ dependencies = [ "proc-macro2 1.0.9", ] +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift 0.1.1", + "winapi", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rayon" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" +dependencies = [ + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +dependencies = [ + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "regex" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" + +[[package]] +name = "ripemd160" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" +dependencies = [ + "block-buffer", + "digest 0.8.1", + "opaque-debug", +] + +[[package]] +name = "rocksdb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" +dependencies = [ + "libc", + "librocksdb-sys", +] + [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "secp256k1" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d311229f403d64002e9eed9964dfa5a0a0c1ac443344f7546bf48e916c6053a" +dependencies = [ + "cc", + "rand 0.6.5", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" + +[[package]] +name = "serde_derive" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +dependencies = [ + "proc-macro2 1.0.9", + "quote 1.0.3", + "syn 1.0.16", +] + +[[package]] +name = "serde_json" +version = "1.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha-1" version = "0.8.2" @@ -278,11 +1140,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ "block-buffer", - "digest", + "digest 0.8.1", "fake-simd", "opaque-debug", ] +[[package]] +name = "sha2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" +dependencies = [ + "block-buffer", + "digest 0.8.1", + "fake-simd", + "opaque-debug", +] + +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + [[package]] name = "single" version = "1.0.0" @@ -292,6 +1172,103 @@ dependencies = [ "failure", ] +[[package]] +name = "smallvec" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" + +[[package]] +name = "snarkos-algorithms" +version = "0.8.0" +dependencies = [ + "blake2", + "derivative", + "digest 0.7.6", + "rand 0.7.3", + "rayon", + "sha2", + "smallvec", + "snarkos-errors", + "snarkos-models", + "snarkos-profiler", + "snarkos-utilities", +] + +[[package]] +name = "snarkos-curves" +version = "0.8.0" +dependencies = [ + "derivative", + "rand 0.7.3", + "snarkos-errors", + "snarkos-models", + "snarkos-utilities", +] + +[[package]] +name = "snarkos-errors" +version = "0.8.0" +dependencies = [ + "base58", + "bincode", + "failure", + "hex 0.4.2", + "jsonrpc-core", + "rocksdb", + "secp256k1", + "wagyu-model", +] + +[[package]] +name = "snarkos-gadgets" +version = "0.8.0" +dependencies = [ + "derivative", + "digest 0.7.6", + "snarkos-algorithms", + "snarkos-curves", + "snarkos-errors", + "snarkos-models", + "snarkos-utilities", +] + +[[package]] +name = "snarkos-models" +version = "0.8.0" +dependencies = [ + "derivative", + "failure", + "rand 0.7.3", + "rand_xorshift 0.2.0", + "smallvec", + "snarkos-errors", + "snarkos-utilities", +] + +[[package]] +name = "snarkos-profiler" +version = "0.8.0" + +[[package]] +name = "snarkos-utilities" +version = "0.8.0" +dependencies = [ + "rand 0.7.3", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + [[package]] name = "syn" version = "0.15.44" @@ -326,6 +1303,42 @@ dependencies = [ "unicode-xid 0.2.0", ] +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tiny-keccak" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" +dependencies = [ + "crunchy 0.2.2", +] + [[package]] name = "typenum" version = "1.11.2" @@ -338,6 +1351,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2" +[[package]] +name = "uint" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ba11732b9161b94c41798e5197e5e75388d012f760c42adb5000353e98646" +dependencies = [ + "byteorder", + "crunchy 0.1.6", + "heapsize", + "rustc-hex", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -350,8 +1381,86 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +[[package]] +name = "vec_map" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" + +[[package]] +name = "version_check" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wagyu-model" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d64afd740a18fd8404dcebc8b15b2f7b63b0886f2c5552b28c8bf7f32ab462a" +dependencies = [ + "base58", + "base58-monero", + "bech32", + "byteorder", + "crypto-mac 0.7.0", + "failure", + "hex 0.3.2", + "rand 0.7.3", + "rand_core 0.5.1", + "ripemd160", + "secp256k1", + "sha2", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 91357f2780..3cc33393c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,6 @@ lazy_static = "1.3.0" pest = "2.0" pest_derive = "2.0" pest-ast = "0.3.3" + +snarkos-gadgets = { path = "../snarkOS/gadgets" } +snarkos-models = { path = "../snarkOS/models" } diff --git a/simple.program b/simple.program index fed79d05f4..9d815113b8 100644 --- a/simple.program +++ b/simple.program @@ -1 +1,2 @@ -x = 5 +x = 5 + 3 +y = x * (x * 2) diff --git a/src/language.pest b/src/language.pest index bf104c46a8..43e79550a0 100644 --- a/src/language.pest +++ b/src/language.pest @@ -3,9 +3,6 @@ file = { SOI ~ NEWLINE* ~ statement* ~ NEWLINE* ~ EOI } -COMMENT = _{ ("/*" ~ (!"*/" ~ ANY)* ~ "*/") | ("//" ~ (!NEWLINE ~ ANY)*) } -WHITESPACE = _{ " " | "\t" ~ NEWLINE } - /// Visibility visibility_public = { "public" } @@ -38,7 +35,7 @@ operation_mul = { "*" } operation_div = { "/" } operation_pow = { "**" } -operation_binary = { +operation_binary = _ { operation_and | operation_or | operation_eq | operation_neq | operation_geq | operation_gt | operation_leq | operation_lt | @@ -73,15 +70,14 @@ variable = @{ ((!protected_name ~ ASCII_ALPHA) | (protected_name ~ (ASCII_ALPHAN /// Expressions // Consider structs, conditionals, postfix, primary, inline array, array initializer, and unary -term = { value | variable | ("(" ~ expression ~ ")") } +expression_primitive = { value | variable } +expression_not = { operation_pre_not ~ expression_term } +expression_term = { expression_primitive | expression_not | ("(" ~ expression ~ ")") } -expression_not = { operation_pre_not ~ term } -expression_increment = { term ~ operation_post_increment } -expression_decrement = { term ~ operation_post_decrement } +expression = { expression_term ~ (operation_binary ~ expression_term)* } -expression_binary = { term ~ (operation_binary ~ term)* } - -expression = { expression_not | expression_increment | expression_decrement | expression_binary } +// expression_increment = { expression ~ operation_post_increment } +// expression_decrement = { expression ~ operation_post_decrement } expression_tuple = _{ (expression ~ ("," ~ expression)*)? } @@ -90,7 +86,13 @@ expression_tuple = _{ (expression ~ ("," ~ expression)*)? } statement_assign = { variable ~ "=" ~ expression } statement_return = { "return" ~ expression_tuple } -statement = { statement_assign | statement_return } +statement = { (statement_return | (statement_assign) ~ NEWLINE) ~ NEWLINE* } + +/// Utilities + +COMMENT = _{ ("/*" ~ (!"*/" ~ ANY)* ~ "*/") | ("//" ~ (!NEWLINE ~ ANY)*) } +WHITESPACE = _{ " " | "\t" ~ NEWLINE } + // /// Conditionals // diff --git a/src/main.rs b/src/main.rs index 2b282c4180..65b8d93094 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,6 @@ extern crate pest_ast; #[macro_use] extern crate lazy_static; - use pest::Parser; use std::fs; @@ -53,7 +52,65 @@ mod ast { ]) } - fn binary_expression_rule<'ast>( + fn parse_term(pair: Pair) -> Box { + Box::new(match pair.as_rule() { + Rule::expression_term => { + let clone = pair.clone(); + let next = clone.into_inner().next().unwrap(); + match next.as_rule() { + Rule::expression_primitive => { + let next = next.into_inner().next().unwrap(); + match next.as_rule() { + Rule::value => Expression::Value( + Value::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap() + ), + Rule::variable => Expression::Variable( + Variable::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), + ), + rule => unreachable!("`expression_primitive` should contain one of [`value`, `variable`], found {:#?}", rule) + } + } + Rule::expression_not => { + let span = next.as_span(); + let mut inner = next.into_inner(); + let operation = match inner.next().unwrap().as_rule() { + Rule::operation_pre_not => Not::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), + rule => unreachable!("`expression_not` should yield `operation_pre_not`, found {:#?}", rule) + }; + let expression = parse_term(inner.next().unwrap()); + Expression::Not(NotExpression { operation, expression, span }) + }, + Rule::expression => Expression::from_pest(&mut pair.into_inner()).unwrap(), // Parenthesis case + + // Rule::expression_increment => { + // let span = next.as_span(); + // let mut inner = next.into_inner(); + // let expression = parse_expression_term(inner.next().unwrap()); + // let operation = match inner.next().unwrap().as_rule() { + // Rule::operation_post_increment => Increment::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), + // rule => unreachable!("`expression_increment` should yield `operation_post_increment`, found {:#?}", rule) + // }; + // Expression::Increment(IncrementExpression { operation, expression, span }) + // }, + // Rule::expression_decrement => { + // let span = next.as_span(); + // let mut inner = next.into_inner(); + // let expression = parse_expression_term(inner.next().unwrap()); + // let operation = match inner.next().unwrap().as_rule() { + // Rule::operation_post_decrement => Decrement::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), + // rule => unreachable!("`expression_decrement` should yield `operation_post_decrement`, found {:#?}", rule) + // }; + // Expression::Decrement(DecrementExpression { operation, expression, span }) + // }, + + rule => unreachable!("`term` should contain one of ['value', 'variable', 'expression', 'expression_not', 'expression_increment', 'expression_decrement'], found {:#?}", rule) + } + } + rule => unreachable!("`parse_expression_term` should be invoked on `Rule::expression_term`, found {:#?}", rule), + }) + } + + fn binary_expression<'ast>( lhs: Box>, pair: Pair<'ast, Rule>, rhs: Box>, @@ -80,57 +137,6 @@ mod ast { }) } - fn parse_rule_term(pair: Pair) -> Box { - Box::new(match pair.as_rule() { - Rule::term => { - let clone = pair.clone(); - let next = clone.into_inner().next().unwrap(); - match next.as_rule() { - Rule::value => Expression::Value( - Value::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap() - ), - Rule::variable => Expression::Variable( - Variable::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), - ), - Rule::expression => Expression::from_pest(&mut pair.into_inner()).unwrap(), // Parenthesis case - - Rule::expression_not => { - let span = next.as_span(); - let mut inner = next.into_inner(); - let operation = match inner.next().unwrap().as_rule() { - Rule::operation_pre_not => Not::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), - rule => unreachable!("`expression_not` should yield `operation_pre_not`, found {:#?}", rule) - }; - let expression = parse_rule_term(inner.next().unwrap()); - Expression::Not(NotExpression { operation, expression, span }) - }, - Rule::expression_increment => { - let span = next.as_span(); - let mut inner = next.into_inner(); - let expression = parse_rule_term(inner.next().unwrap()); - let operation = match inner.next().unwrap().as_rule() { - Rule::operation_post_increment => Increment::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), - rule => unreachable!("`expression_increment` should yield `operation_post_increment`, found {:#?}", rule) - }; - Expression::Increment(IncrementExpression { operation, expression, span }) - }, - Rule::expression_decrement => { - let span = next.as_span(); - let mut inner = next.into_inner(); - let expression = parse_rule_term(inner.next().unwrap()); - let operation = match inner.next().unwrap().as_rule() { - Rule::operation_post_decrement => Decrement::from_pest(&mut pair.into_inner().next().unwrap().into_inner()).unwrap(), - rule => unreachable!("`expression_decrement` should yield `operation_post_decrement`, found {:#?}", rule) - }; - Expression::Decrement(DecrementExpression { operation, expression, span }) - }, - rule => unreachable!("`term` should contain one of ['value', 'variable', 'expression', 'expression_not', 'expression_increment', 'expression_decrement'], found {:#?}", rule) - } - } - rule => unreachable!("`parse_rule_term` should be invoked on `Rule::term`, found {:#?}", rule), - }) - } - #[derive(Clone, Debug, FromPest, PartialEq)] #[pest_ast(rule(Rule::file))] pub struct File<'ast> { @@ -257,25 +263,25 @@ mod ast { pub span: Span<'ast>, } - #[derive(Clone, Debug, FromPest, PartialEq)] - #[pest_ast(rule(Rule::expression_increment))] - pub struct IncrementExpression<'ast> { - pub expression: Box>, - pub operation: Increment<'ast>, - #[pest_ast(outer())] - pub span: Span<'ast>, - } + // #[derive(Clone, Debug, FromPest, PartialEq)] + // #[pest_ast(rule(Rule::expression_increment))] + // pub struct IncrementExpression<'ast> { + // pub expression: Box>, + // pub operation: Increment<'ast>, + // #[pest_ast(outer())] + // pub span: Span<'ast>, + // } + // + // #[derive(Clone, Debug, FromPest, PartialEq)] + // #[pest_ast(rule(Rule::expression_decrement))] + // pub struct DecrementExpression<'ast> { + // pub expression: Box>, + // pub operation: Decrement<'ast>, + // #[pest_ast(outer())] + // pub span: Span<'ast>, + // } - #[derive(Clone, Debug, FromPest, PartialEq)] - #[pest_ast(rule(Rule::expression_decrement))] - pub struct DecrementExpression<'ast> { - pub expression: Box>, - pub operation: Decrement<'ast>, - #[pest_ast(outer())] - pub span: Span<'ast>, - } - - #[derive(Debug, PartialEq, Clone)] + #[derive(Clone, Debug, PartialEq)] pub struct BinaryExpression<'ast> { pub operation: BinaryOperator, pub left: Box>, @@ -283,14 +289,15 @@ mod ast { pub span: Span<'ast>, } - #[derive(Debug, PartialEq, Clone)] + #[derive(Clone, Debug, PartialEq)] pub enum Expression<'ast> { Value(Value<'ast>), Variable(Variable<'ast>), Not(NotExpression<'ast>), - Increment(IncrementExpression<'ast>), - Decrement(DecrementExpression<'ast>), Binary(BinaryExpression<'ast>), + + // Increment(IncrementExpression<'ast>), + // Decrement(DecrementExpression<'ast>), } impl<'ast> Expression<'ast> { @@ -308,9 +315,10 @@ mod ast { Expression::Value(expression) => &expression.span(), Expression::Variable(expression) => &expression.span, Expression::Not(expression) => &expression.span, - Expression::Increment(expression) => &expression.span, - Expression::Decrement(expression) => &expression.span, Expression::Binary(expression) => &expression.span, + + // Expression::Increment(expression) => &expression.span, + // Expression::Decrement(expression) => &expression.span, } } } @@ -320,14 +328,13 @@ mod ast { type FatalError = Void; fn from_pest(pest: &mut Pairs<'ast, Rule>) -> Result> { - let mut pairs = pest.clone(); - println!("{:?}\n", pairs); - let pair = pairs.next().ok_or(::from_pest::ConversionError::NoMatch)?; + let mut clone = pest.clone(); + let pair = clone.next().ok_or(::from_pest::ConversionError::NoMatch)?; match pair.as_rule() { Rule::expression => { // Transfer iterated state to pest. - *pest = pairs; - Ok(*PRECEDENCE_CLIMBER.climb(pair.into_inner(), parse_rule_term, binary_expression_rule)) + *pest = clone; + Ok(*PRECEDENCE_CLIMBER.climb(pair.into_inner(), parse_term, binary_expression)) } _ => Err(ConversionError::NoMatch), } @@ -369,12 +376,31 @@ mod ast { fn main() { use crate::from_pest::FromPest; + use snarkos_gadgets::curves::edwards_bls12::FqGadget; + use snarkos_models::gadgets::{r1cs::{ConstraintSystem, TestConstraintSystem, Fr}, utilities::{alloc::AllocGadget, boolean::Boolean}}; let unparsed_file = fs::read_to_string("simple.program").expect("cannot read file"); let mut file = LanguageParser::parse(Rule::file, &unparsed_file).expect("unsuccessful parse"); let syntax_tree = ast::File::from_pest(&mut file).expect("infallible"); - println!("{:?}", syntax_tree); + for statement in syntax_tree.statement { + match statement { + ast::Statement::Assign(statement) => { + println!("{:#?}", statement); + }, + ast::Statement::Return(statement) => { + + } + } + } + + let mut cs = TestConstraintSystem::::new(); + + Boolean::alloc(cs.ns(|| format!("boolean")), || Ok(true)); + + + println!("\n\n number of constraints for input: {}", cs.num_constraints()); + // for token in file.into_inner() { // match token.as_rule() { @@ -406,8 +432,8 @@ fn main() { // println!("Sum of fields: {}", field_sum); // println!("Number of records: {}", record_count); - let successful_parse = LanguageParser::parse(Rule::value, "-273"); - println!("{:?}", successful_parse); + // let successful_parse = LanguageParser::parse(Rule::value, "-273"); + // println!("{:?}", successful_parse); // let unsuccessful_parse = CSVParser::parse(Rule::field, "this is not a number"); // println!("{:?}", unsuccessful_parse);