From 1786ab8f4bcd08607c39048fbcdd0f80b121ff98 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Tue, 3 Nov 2020 17:43:58 +0300 Subject: [PATCH] LALRPOP parser for AIR (#13) --- Cargo.lock | 386 ++- Cargo.toml | 1 + artifacts/aquamarine.wasm | Bin 594391 -> 0 bytes crates/air-parser/Cargo.toml | 17 + crates/air-parser/build.rs | 24 + crates/air-parser/src/ast.rs | 95 + crates/air-parser/src/lalrpop/aqua.lalrpop | 90 + crates/air-parser/src/lalrpop/aqua.rs | 2132 +++++++++++++++++ crates/air-parser/src/lalrpop/parser.rs | 119 + crates/air-parser/src/lalrpop/tests.rs | 364 +++ crates/air-parser/src/lib.rs | 20 + crates/test-utils/src/lib.rs | 6 +- stepper-lib/Cargo.toml | 2 +- stepper-lib/benches/call_benchmark.rs | 2 +- stepper-lib/benches/chat_benchmark.rs | 34 +- .../benches/create_service_benchmark.rs | 38 +- stepper-lib/src/air/call.rs | 49 +- stepper-lib/src/air/call/parsed_call.rs | 186 +- stepper-lib/src/air/call/triplet.rs | 83 + stepper-lib/src/air/call/utils.rs | 141 +- stepper-lib/src/air/execution_context.rs | 8 +- stepper-lib/src/air/fold.rs | 152 +- stepper-lib/src/air/mod.rs | 35 +- stepper-lib/src/air/null.rs | 10 +- stepper-lib/src/air/par.rs | 42 +- stepper-lib/src/air/seq.rs | 27 +- stepper-lib/src/air/xor.rs | 27 +- stepper-lib/src/errors.rs | 25 +- stepper-lib/src/execution.rs | 2 +- stepper-lib/src/execution/prolog.rs | 20 +- stepper-lib/src/execution/utils.rs | 55 - stepper-lib/src/lib.rs | 6 +- stepper-lib/tests/air_basic.rs | 66 +- stepper-lib/tests/call_evidence_basic.rs | 150 +- stepper-lib/tests/data_merge.rs | 74 +- stepper-lib/tests/join.rs | 64 +- 36 files changed, 3817 insertions(+), 735 deletions(-) delete mode 100644 artifacts/aquamarine.wasm create mode 100644 crates/air-parser/Cargo.toml create mode 100644 crates/air-parser/build.rs create mode 100644 crates/air-parser/src/ast.rs create mode 100644 crates/air-parser/src/lalrpop/aqua.lalrpop create mode 100644 crates/air-parser/src/lalrpop/aqua.rs create mode 100644 crates/air-parser/src/lalrpop/parser.rs create mode 100644 crates/air-parser/src/lalrpop/tests.rs create mode 100644 crates/air-parser/src/lib.rs create mode 100644 stepper-lib/src/air/call/triplet.rs diff --git a/Cargo.lock b/Cargo.lock index 3553ad20..797ff920 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "air-parser" +version = "0.1.0" +dependencies = [ + "codespan", + "codespan-reporting", + "fstrings", + "lalrpop", + "lalrpop-util", + "regex", +] + [[package]] name = "ansi_term" version = "0.11.0" @@ -20,9 +32,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fd36ffbb1fb7c834eac128ea8d0e310c5aeb635548f9d58861e1308d46e71c" +checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" [[package]] name = "aqua-test-module" @@ -80,6 +92,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "ascii-canvas" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29" +dependencies = [ + "term", +] + [[package]] name = "atty" version = "0.2.14" @@ -97,6 +118,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "bincode" version = "1.3.1" @@ -107,12 +134,38 @@ dependencies = [ "serde", ] +[[package]] +name = "bit-set" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" + [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "blake3" version = "0.3.7" @@ -128,6 +181,27 @@ dependencies = [ "digest 0.9.0", ] +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.3", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + [[package]] name = "boolinator" version = "2.4.0" @@ -152,6 +226,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + [[package]] name = "byteorder" version = "1.3.4" @@ -212,10 +292,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "475bd7aa7680b4ed8f6bb59745e882bcbaeb39326532bb79ffb1716480d9a274" [[package]] -name = "const_fn" -version = "0.4.2" +name = "codespan" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce90df4c658c62f12d78f7508cf92f9173e5184a539c10bfe54a3107b3ffd0f2" +checksum = "8ebaf6bb6a863ad6aa3a18729e9710c53d75df03306714d9cc1f7357a00cd789" +dependencies = [ + "codespan-reporting", +] + +[[package]] +name = "codespan-reporting" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0762455306b1ed42bc651ef6a2197aabda5e1d4a43c34d5eab5c1a3634e81d" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "const_fn" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab" [[package]] name = "constant_time_eq" @@ -326,7 +425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils", + "crossbeam-utils 0.8.0", ] [[package]] @@ -337,7 +436,7 @@ checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-utils 0.8.0", ] [[package]] @@ -348,12 +447,23 @@ checksum = "ec0f606a85340376eef0d6d8fec399e6d4a544d648386c6645eb6d0653b27d9f" dependencies = [ "cfg-if 1.0.0", "const_fn", - "crossbeam-utils", + "crossbeam-utils 0.8.0", "lazy_static", "memoffset", "scopeguard", ] +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if 0.1.10", + "lazy_static", +] + [[package]] name = "crossbeam-utils" version = "0.8.0" @@ -408,6 +518,12 @@ dependencies = [ "syn", ] +[[package]] +name = "diff" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" + [[package]] name = "difference" version = "2.0.0" @@ -432,12 +548,44 @@ dependencies = [ "generic-array 0.14.4", ] +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "docopt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969" +dependencies = [ + "lazy_static", + "regex", + "serde", + "strsim", +] + [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "ena" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" +dependencies = [ + "log", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -481,6 +629,12 @@ dependencies = [ "libc", ] +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + [[package]] name = "fce" version = "0.1.9" @@ -523,6 +677,12 @@ dependencies = [ "wasmer-runtime-core-fl", ] +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + [[package]] name = "fluence" version = "0.2.8" @@ -618,6 +778,28 @@ dependencies = [ "uuid", ] +[[package]] +name = "fstrings" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7845a0f15da505ac36baad0486612dab57f8b8d34e19c5470a265bbcdd572ae6" +dependencies = [ + "fstrings-proc-macro", + "proc-macro-hack", +] + +[[package]] +name = "fstrings-proc-macro" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b58c0e7581dc33478a32299182cbe5ae3b8c028be26728a47fb0a113c92d9d" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "gcc" version = "0.3.55" @@ -650,7 +832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ "typenum", - "version_check 0.9.2", + "version_check", ] [[package]] @@ -806,6 +988,40 @@ dependencies = [ "serde_json", ] +[[package]] +name = "lalrpop" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60fb56191fb8ed5311597e5750debe6779c9fdb487dbaa5ff302592897d7a2c8" +dependencies = [ + "ascii-canvas", + "atty", + "bit-set", + "diff", + "docopt", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "serde", + "serde_derive", + "sha2", + "string_cache", + "term", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6771161eff561647fad8bb7e745e002c304864fb8f436b52b30acda51fca4408" +dependencies = [ + "regex", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -901,6 +1117,12 @@ dependencies = [ "serde", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + [[package]] name = "nix" version = "0.15.0" @@ -914,16 +1136,6 @@ dependencies = [ "void", ] -[[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -dependencies = [ - "memchr", - "version_check 0.1.5", -] - [[package]] name = "nom" version = "5.1.2" @@ -932,7 +1144,7 @@ checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" dependencies = [ "lexical-core", "memchr", - "version_check 0.9.2", + "version_check", ] [[package]] @@ -966,6 +1178,12 @@ version = "11.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + [[package]] name = "output_vt100" version = "0.1.2" @@ -1015,6 +1233,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + [[package]] name = "plotters" version = "0.2.15" @@ -1029,9 +1266,15 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty_assertions" @@ -1045,6 +1288,12 @@ dependencies = [ "output_vt100", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + [[package]] name = "proc-macro2" version = "1.0.24" @@ -1152,7 +1401,7 @@ checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" dependencies = [ "crossbeam-channel", "crossbeam-deque", - "crossbeam-utils", + "crossbeam-utils 0.8.0", "lazy_static", "num_cpus", ] @@ -1164,10 +1413,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] -name = "regex" -version = "1.4.1" +name = "redox_users" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8963b85b8ce3074fecffde43b4b0dded83ce2f367dc8d363afc56679f3ee820b" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + +[[package]] +name = "regex" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" dependencies = [ "aho-corasick", "memchr", @@ -1186,9 +1446,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cab7a364d15cde1e505267766a2d3c4e22a843e1a601f0fa7564c0f82ced11c" +checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" + +[[package]] +name = "rust-argon2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils 0.7.2", +] [[package]] name = "rustc_version" @@ -1303,15 +1575,23 @@ dependencies = [ ] [[package]] -name = "serde_sexpr" -version = "0.1.0" +name = "sha2" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5318bfeed779c64075ce317c81462ed54dc00021be1c6b34957d798e11a68bdb" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" dependencies = [ - "nom 4.2.3", - "serde", + "block-buffer", + "digest 0.8.1", + "fake-simd", + "opaque-debug", ] +[[package]] +name = "siphasher" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7" + [[package]] name = "smallvec" version = "1.4.2" @@ -1328,6 +1608,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" name = "stepper-lib" version = "0.1.2" dependencies = [ + "air-parser", "aqua-test-utils", "aquamarine-vm", "boolinator", @@ -1342,10 +1623,28 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_sexpr", "wasm-bindgen", ] +[[package]] +name = "string_cache" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2940c75beb4e3bf3a494cef919a747a2cb81e52571e212bfbd185074add7208a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + [[package]] name = "subtle" version = "2.3.0" @@ -1369,6 +1668,17 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" +[[package]] +name = "term" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" +dependencies = [ + "byteorder", + "dirs", + "winapi", +] + [[package]] name = "termcolor" version = "1.1.0" @@ -1503,12 +1813,6 @@ dependencies = [ "rand", ] -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - [[package]] name = "version_check" version = "0.9.2" @@ -1683,7 +1987,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1de496e366bd1c198942248fc1de4b94e4647b263dd60099d5f7776f0d621656" dependencies = [ "log", - "nom 5.1.2", + "nom", "safe-transmute", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 5a0ba7c6..ee1ca13f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "crates/air-parser", "crates/test-module", "crates/test-utils", "stepper", diff --git a/artifacts/aquamarine.wasm b/artifacts/aquamarine.wasm deleted file mode 100644 index 0c3945819cb583c13f17c105d69d8c6c813aac22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594391 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 KxfCIHqDp*7EAb(9@d1h##0Qi0j^!(x9?57v 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%0Dw>NoM=J*A%J~`JV{860>6?S#DP(cdwFaVGzpFl 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 NOJ)o$+Y8GF{s#s~h!X$+ diff --git a/crates/air-parser/Cargo.toml b/crates/air-parser/Cargo.toml new file mode 100644 index 00000000..bb947066 --- /dev/null +++ b/crates/air-parser/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "air-parser" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[build-dependencies] +lalrpop = { version = "0.19.1", features = ["lexer"] } + +[dependencies] +lalrpop-util = { version = "0.19.1", features = ["lexer"] } +regex = "1.4.1" +codespan = "0.9.5" +codespan-reporting = "0.9.5" + +[dev-dependencies] +fstrings = "0.2.3" diff --git a/crates/air-parser/build.rs b/crates/air-parser/build.rs new file mode 100644 index 00000000..e8855cd0 --- /dev/null +++ b/crates/air-parser/build.rs @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern crate lalrpop; + +fn main() { + lalrpop::Configuration::new() + .generate_in_source_tree() + .process() + .unwrap(); +} diff --git a/crates/air-parser/src/ast.rs b/crates/air-parser/src/ast.rs new file mode 100644 index 00000000..522d9b24 --- /dev/null +++ b/crates/air-parser/src/ast.rs @@ -0,0 +1,95 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use std::rc::Rc; + +#[derive(Debug, PartialEq, Eq)] +pub enum Instruction<'i> { + Null(Null), + Call(Call<'i>), + Seq(Seq<'i>), + Par(Par<'i>), + Xor(Xor<'i>), + Fold(Fold<'i>), + Next(Next<'i>), + Error, +} + +#[derive(Debug, PartialEq, Eq)] +pub enum PeerPart<'i> { + PeerPk(Value<'i>), + PeerPkWithServiceId(Value<'i>, Value<'i>), +} + +#[derive(Debug, PartialEq, Eq)] +pub enum FunctionPart<'i> { + FuncName(Value<'i>), + ServiceIdWithFuncName(Value<'i>, Value<'i>), +} + +#[derive(Debug, PartialEq, Eq)] +pub struct Call<'i> { + pub peer_part: PeerPart<'i>, + pub function_part: FunctionPart<'i>, + pub args: Vec>, + pub output: CallOutput<'i>, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum Value<'i> { + Variable(&'i str), + Literal(&'i str), + JsonPath { variable: &'i str, path: &'i str }, + CurrentPeerId, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum CallOutput<'i> { + Scalar(&'i str), + Accumulator(&'i str), +} + +impl<'i> CallOutput<'i> { + pub fn name(&self) -> &'i str { + use CallOutput::*; + + match self { + Scalar(name) | Accumulator(name) => name, + } + } +} + +#[derive(Debug, PartialEq, Eq)] +pub struct Seq<'i>(pub Box>, pub Box>); + +#[derive(Debug, PartialEq, Eq)] +pub struct Par<'i>(pub Box>, pub Box>); + +#[derive(Debug, PartialEq, Eq)] +pub struct Xor<'i>(pub Box>, pub Box>); + +#[derive(Debug, PartialEq, Eq)] +pub struct Fold<'i> { + pub iterable: &'i str, + pub iterator: &'i str, + pub instruction: Rc>, +} + +#[derive(Debug, PartialEq, Eq)] +pub struct Next<'i>(pub &'i str); + +#[derive(Debug, PartialEq, Eq)] +pub struct Null; diff --git a/crates/air-parser/src/lalrpop/aqua.lalrpop b/crates/air-parser/src/lalrpop/aqua.lalrpop new file mode 100644 index 00000000..590ad271 --- /dev/null +++ b/crates/air-parser/src/lalrpop/aqua.lalrpop @@ -0,0 +1,90 @@ +use crate::ast::*; +use crate::lalrpop::parser::InstructionError; + +use lalrpop_util::ErrorRecovery; +use std::rc::Rc; + +grammar<'err>(errors: &'err mut Vec, InstructionError>>); + +extern { + type Error = InstructionError; +} + +pub Instr: Box> = { + "(" "seq" ")" => Box::new(Instruction::Seq(Seq(l, r))), + "(" "par" ")" => Box::new(Instruction::Par(Par(l, r))), + "(" "xor" ")" => Box::new(Instruction::Xor(Xor(l, r))), + + "(" "call" ")" => + Box::new(Instruction::Call(Call{peer, f, args, output})), + + "(" "fold" ")" => { + let instruction = Rc::new(*i); + Box::new(Instruction::Fold(Fold{ iterable, iterator, instruction })) + }, + + "(" "next" ")" => Box::new(Instruction::Next(Next(i))), + "(" "null" ")" => Box::new(Instruction::Null(Null)), + ! => { errors.push(<>); Box::new(Instruction::Error) }, +} + +Args: Vec> = { + "[" )*> "]" => args +} + + +FPart: FunctionPart<'input> = { + => FunctionPart::FuncName(f), + "(" ")" => FunctionPart::ServiceIdWithFuncName(sid, f), +} + + +PeerPart: PeerPart<'input> = { + => PeerPart::PeerPk(pid), + "(" ")" => PeerPart::PeerPkWithServiceId(pid, sid), +} + +// TODO: make output one of _ () "" and absence +Output: CallOutput<'input> = { + => CallOutput::Scalar(o), + => CallOutput::Accumulator(&o[..o.len()-2]), +}; + +Function = Value; +PeerId = Value; +ServiceId = Value; +Arg = Value; + +Value: Value<'input> = { + "\"" "\"" => Value::Literal(""), // TODO: signal absence somehow? + "\"" "\"" => Value::Literal(v), + => Value::Variable(v), + => { + let mut path = v.splitn(2, "."); + let variable = path.next().expect("must contain dot"); + let path = path.next().expect("contain component after dot"); + Value::JsonPath { variable, path } + }, + CURRENT_PEER_ID => Value::CurrentPeerId, +} + + + +Alphanumeric = ALPHANUMERIC; + +match { + r"[\w_-]+" => ALPHANUMERIC, + r"[\w_-]+\[\]" => ACCUMULATOR, + r"[\w_-]+\.\$[^ ]+" => JSON_PATH, + "%current_peer_id%" => CURRENT_PEER_ID, + "seq", + "call", + "null", + "par", + "xor", + "fold", + "next", +} else { + _ +} + diff --git a/crates/air-parser/src/lalrpop/aqua.rs b/crates/air-parser/src/lalrpop/aqua.rs new file mode 100644 index 00000000..0ce9fe0d --- /dev/null +++ b/crates/air-parser/src/lalrpop/aqua.rs @@ -0,0 +1,2132 @@ +// auto-generated: "lalrpop 0.19.1" +// sha256: fa6ea5baecd44655b8abc437c5b5ee123eb73a92a59ff6ad15d7671350686b +use crate::ast::*; +use crate::lalrpop::parser::InstructionError; +use lalrpop_util::ErrorRecovery; +use std::rc::Rc; +#[allow(unused_extern_crates)] +extern crate lalrpop_util as __lalrpop_util; +#[allow(unused_imports)] +use self::__lalrpop_util::state_machine as __state_machine; + +#[cfg_attr(rustfmt, rustfmt_skip)] +mod __parse__Instr { + #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)] + + use crate::ast::*; + use crate::lalrpop::parser::InstructionError; + use lalrpop_util::ErrorRecovery; + use std::rc::Rc; + #[allow(unused_extern_crates)] + extern crate lalrpop_util as __lalrpop_util; + #[allow(unused_imports)] + use self::__lalrpop_util::state_machine as __state_machine; + use self::__lalrpop_util::lexer::Token; + #[allow(dead_code)] + pub enum __Symbol<'input> + { + Variant0(&'input str), + Variant1(__lalrpop_util::ErrorRecovery, InstructionError>), + Variant2(Value<'input>), + Variant3(::std::vec::Vec>), + Variant4(Vec>), + Variant5(FunctionPart<'input>), + Variant6(Box>), + Variant7(CallOutput<'input>), + Variant8(PeerPart<'input>), + } + const __ACTION: &[i8] = &[ + // State 0 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 1 + 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 2 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + // State 3 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + // State 4 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 5 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 6 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 7 + 9, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 8 + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + // State 9 + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + // State 11 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 12 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 13 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 14 + 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 15 + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 16 + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 17 + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + // State 18 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 30, 0, 0, 0, + // State 19 + 9, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 20 + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 21 + 9, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, + // State 22 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 23 + 0, 0, 0, 0, 0, 2, 3, 4, 26, 5, 6, 7, 0, 0, 0, 0, 0, + // State 24 + 0, -20, -20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20, + // State 25 + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 26 + -29, -29, -29, -29, -29, 0, 0, 0, 0, 0, 0, 0, 0, -29, -29, -29, 0, + // State 27 + -24, -24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24, -24, -24, 0, + // State 28 + -23, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23, -23, -23, 0, + // State 29 + -6, -6, -6, -6, -6, 0, 0, 0, 0, 0, 0, 0, 0, -6, -6, -6, -6, + // State 30 + -31, -31, -31, -31, -31, 0, 0, 0, 0, 0, 0, 0, 0, -31, -31, -31, 0, + // State 31 + -30, -30, -30, -30, -30, 0, 0, 0, 0, 0, 0, 0, 0, -30, -30, -30, 0, + // State 32 + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 33 + 0, -19, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19, + // State 34 + 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 35 + 0, 0, -12, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 36 + 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 37 + -27, -27, -27, -27, -27, 0, 0, 0, 0, 0, 0, 0, 0, -27, -27, -27, 0, + // State 38 + 0, -18, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18, + // State 39 + 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 40 + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 41 + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 42 + -26, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, -26, -26, 0, + // State 43 + -28, -28, -28, -28, -28, 0, 0, 0, 0, 0, 0, 0, 0, -28, -28, -28, 0, + // State 44 + 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 45 + 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 46 + 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, + // State 47 + 0, -13, -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, + // State 48 + 0, -15, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, + // State 49 + 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 50 + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 51 + 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 52 + -4, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, 0, + // State 53 + -7, 0, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, -7, -7, -7, 0, + // State 54 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, 0, 0, 0, + // State 55 + 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 56 + -25, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25, -25, -25, 0, + // State 57 + 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, + // State 58 + 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, + // State 59 + -5, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, 0, + // State 60 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9, -9, 0, 0, 0, + // State 61 + 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + fn __action(state: i8, integer: usize) -> i8 { + __ACTION[(state as usize) * 17 + integer] + } + const __EOF_ACTION: &[i8] = &[ + // State 0 + 0, + // State 1 + 0, + // State 2 + 0, + // State 3 + 0, + // State 4 + 0, + // State 5 + 0, + // State 6 + 0, + // State 7 + 0, + // State 8 + 0, + // State 9 + 0, + // State 10 + 0, + // State 11 + 0, + // State 12 + 0, + // State 13 + 0, + // State 14 + 0, + // State 15 + 0, + // State 16 + 0, + // State 17 + 0, + // State 18 + 0, + // State 19 + 0, + // State 20 + 0, + // State 21 + 0, + // State 22 + -32, + // State 23 + 0, + // State 24 + -20, + // State 25 + 0, + // State 26 + 0, + // State 27 + 0, + // State 28 + 0, + // State 29 + 0, + // State 30 + 0, + // State 31 + 0, + // State 32 + 0, + // State 33 + -19, + // State 34 + 0, + // State 35 + 0, + // State 36 + 0, + // State 37 + 0, + // State 38 + -18, + // State 39 + 0, + // State 40 + 0, + // State 41 + 0, + // State 42 + 0, + // State 43 + 0, + // State 44 + 0, + // State 45 + 0, + // State 46 + -14, + // State 47 + -13, + // State 48 + -15, + // State 49 + 0, + // State 50 + 0, + // State 51 + 0, + // State 52 + 0, + // State 53 + 0, + // State 54 + 0, + // State 55 + 0, + // State 56 + 0, + // State 57 + -17, + // State 58 + -16, + // State 59 + 0, + // State 60 + 0, + // State 61 + 0, + ]; + fn __goto(state: i8, nt: usize) -> i8 { + match nt { + 2 => 21, + 3 => match state { + 2 => 10, + 10 => 17, + 3 => 32, + 8 => 36, + 18 => 49, + _ => 26, + }, + 4 => match state { + 21 => 59, + _ => 52, + }, + 5 => 18, + 6 => 14, + 7 => match state { + 20 => 55, + _ => 34, + }, + 8 => match state { + 5 => 12, + 6 => 13, + 0 => 22, + 11 => 39, + 12 => 40, + 13 => 41, + 17 => 45, + _ => 11, + }, + 9 => 50, + 10 => match state { + 1 => 27, + _ => 16, + }, + 11 => 7, + 12 => match state { + 16 => 44, + _ => 20, + }, + 13 => match state { + 7 | 20 => 35, + 15..=16 => 42, + 19 | 21 => 53, + _ => 28, + }, + _ => 0, + } + } + fn __expected_tokens(__state: i8) -> Vec<::std::string::String> { + const __TERMINAL: &[&str] = &[ + r###""\"""###, + r###""(""###, + r###"")""###, + r###""[""###, + r###""]""###, + r###""call""###, + r###""fold""###, + r###""next""###, + r###""null""###, + r###""par""###, + r###""seq""###, + r###""xor""###, + r###"ACCUMULATOR"###, + r###"ALPHANUMERIC"###, + r###"CURRENT_PEER_ID"###, + r###"JSON_PATH"###, + ]; + __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| { + let next_state = __action(__state, index); + if next_state == 0 { + None + } else { + Some(terminal.to_string()) + } + }).collect() + } + pub struct __StateMachine<'input, 'err> + where 'input: 'err + { + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __phantom: ::std::marker::PhantomData<(&'input (), &'err ())>, + } + impl<'input, 'err> __state_machine::ParserDefinition for __StateMachine<'input, 'err> + where 'input: 'err + { + type Location = usize; + type Error = InstructionError; + type Token = Token<'input>; + type TokenIndex = usize; + type Symbol = __Symbol<'input>; + type Success = Box>; + type StateIndex = i8; + type Action = i8; + type ReduceIndex = i8; + type NonterminalIndex = usize; + + #[inline] + fn start_location(&self) -> Self::Location { + Default::default() + } + + #[inline] + fn start_state(&self) -> Self::StateIndex { + 0 + } + + #[inline] + fn token_to_index(&self, token: &Self::Token) -> Option { + __token_to_integer(token, ::std::marker::PhantomData::<(&(), &())>) + } + + #[inline] + fn action(&self, state: i8, integer: usize) -> i8 { + __action(state, integer) + } + + #[inline] + fn error_action(&self, state: i8) -> i8 { + __action(state, 17 - 1) + } + + #[inline] + fn eof_action(&self, state: i8) -> i8 { + __EOF_ACTION[state as usize] + } + + #[inline] + fn goto(&self, state: i8, nt: usize) -> i8 { + __goto(state, nt) + } + + fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol { + __token_to_symbol(token_index, token, ::std::marker::PhantomData::<(&(), &())>) + } + + fn expected_tokens(&self, state: i8) -> Vec { + __expected_tokens(state) + } + + #[inline] + fn uses_error_recovery(&self) -> bool { + true + } + + #[inline] + fn error_recovery_symbol( + &self, + recovery: __state_machine::ErrorRecovery, + ) -> Self::Symbol { + __Symbol::Variant1(recovery) + } + + fn reduce( + &mut self, + action: i8, + start_location: Option<&Self::Location>, + states: &mut Vec, + symbols: &mut Vec<__state_machine::SymbolTriple>, + ) -> Option<__state_machine::ParseResult> { + __reduce( + self.errors, + self.input, + action, + start_location, + states, + symbols, + ::std::marker::PhantomData::<(&(), &())>, + ) + } + + fn simulate_reduce(&self, action: i8) -> __state_machine::SimulatedReduce { + __simulate_reduce(action, ::std::marker::PhantomData::<(&(), &())>) + } + } + fn __token_to_integer< + 'input, + 'err, + >( + __token: &Token<'input>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> Option + { + match *__token { + Token(0, _) if true => Some(0), + Token(1, _) if true => Some(1), + Token(2, _) if true => Some(2), + Token(3, _) if true => Some(3), + Token(4, _) if true => Some(4), + Token(9, _) if true => Some(5), + Token(10, _) if true => Some(6), + Token(11, _) if true => Some(7), + Token(12, _) if true => Some(8), + Token(13, _) if true => Some(9), + Token(14, _) if true => Some(10), + Token(15, _) if true => Some(11), + Token(7, _) if true => Some(12), + Token(5, _) if true => Some(13), + Token(8, _) if true => Some(14), + Token(6, _) if true => Some(15), + _ => None, + } + } + fn __token_to_symbol< + 'input, + 'err, + >( + __token_index: usize, + __token: Token<'input>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> __Symbol<'input> + { + match __token_index { + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 => match __token { + Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(7, __tok0) | Token(5, __tok0) | Token(8, __tok0) | Token(6, __tok0) if true => __Symbol::Variant0(__tok0), + _ => unreachable!(), + }, + _ => unreachable!(), + } + } + fn __simulate_reduce< + 'input, + 'err, + >( + __reduce_index: i8, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> __state_machine::SimulatedReduce<__StateMachine<'input, 'err>> + where + 'input: 'err, + { + match __reduce_index { + 0 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 0, + } + } + 1 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 0, + nonterminal_produced: 1, + } + } + 2 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 1, + } + } + 3 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 2, + } + } + 4 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 2, + } + } + 5 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 3, + } + } + 6 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 4, + } + } + 7 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 5, + } + } + 8 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 5, + } + } + 9 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 6, + } + } + 10 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 6, + } + } + 11 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 7, + } + } + 12 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 8, + } + } + 13 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 8, + } + } + 14 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 8, + } + } + 15 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 8, + } + } + 16 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 8, + } + } + 17 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 8, + } + } + 18 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 8, + } + } + 19 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 8, + } + } + 20 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 9, + } + } + 21 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 9, + } + } + 22 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 10, + } + } + 23 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 11, + } + } + 24 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 11, + } + } + 25 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 12, + } + } + 26 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 13, + } + } + 27 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 13, + } + } + 28 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 13, + } + } + 29 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 13, + } + } + 30 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 13, + } + } + 31 => __state_machine::SimulatedReduce::Accept, + _ => panic!("invalid reduction index {}", __reduce_index) + } + } + pub struct InstrParser { + builder: __lalrpop_util::lexer::MatcherBuilder, + _priv: (), + } + + impl InstrParser { + pub fn new() -> InstrParser { + let __builder = super::__intern_token::new_builder(); + InstrParser { + builder: __builder, + _priv: (), + } + } + + #[allow(dead_code)] + pub fn parse< + 'input, + 'err, + >( + &self, + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + ) -> Result>, __lalrpop_util::ParseError, InstructionError>> + { + let mut __tokens = self.builder.matcher(input); + __state_machine::Parser::drive( + __StateMachine { + errors, + input, + __phantom: ::std::marker::PhantomData::<(&(), &())>, + }, + __tokens, + ) + } + } + fn __accepts< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __error_state: i8, + __states: & [i8], + __opt_integer: Option, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> bool + { + let mut __states = __states.to_vec(); + __states.push(__error_state); + loop { + let mut __states_len = __states.len(); + let __top = __states[__states_len - 1]; + let __action = match __opt_integer { + None => __EOF_ACTION[__top as usize], + Some(__integer) => __action(__top, __integer), + }; + if __action == 0 { return false; } + if __action > 0 { return true; } + let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), ::std::marker::PhantomData::<(&(), &())>) { + __state_machine::SimulatedReduce::Reduce { + states_to_pop, nonterminal_produced + } => (states_to_pop, nonterminal_produced), + __state_machine::SimulatedReduce::Accept => return true, + }; + __states_len -= __to_pop; + __states.truncate(__states_len); + let __top = __states[__states_len - 1]; + let __next_state = __goto(__top, __nt); + __states.push(__next_state); + } + } + pub(crate) fn __reduce< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __action: i8, + __lookahead_start: Option<&usize>, + __states: &mut ::std::vec::Vec, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> Option>,__lalrpop_util::ParseError, InstructionError>>> + { + let (__pop_states, __nonterminal) = match __action { + 0 => { + __reduce0(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 1 => { + __reduce1(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 2 => { + __reduce2(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 3 => { + __reduce3(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 4 => { + __reduce4(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 5 => { + __reduce5(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 6 => { + __reduce6(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 7 => { + __reduce7(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 8 => { + __reduce8(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 9 => { + __reduce9(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 10 => { + __reduce10(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 11 => { + __reduce11(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 12 => { + __reduce12(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 13 => { + __reduce13(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 14 => { + __reduce14(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 15 => { + __reduce15(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 16 => { + __reduce16(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 17 => { + __reduce17(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 18 => { + __reduce18(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 19 => { + __reduce19(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 20 => { + __reduce20(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 21 => { + __reduce21(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 22 => { + __reduce22(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 23 => { + __reduce23(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 24 => { + __reduce24(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 25 => { + __reduce25(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 26 => { + __reduce26(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 27 => { + __reduce27(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 28 => { + __reduce28(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 29 => { + __reduce29(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 30 => { + __reduce30(errors, input, __lookahead_start, __symbols, ::std::marker::PhantomData::<(&(), &())>) + } + 31 => { + // __Instr = Instr => ActionFn(0); + let __sym0 = __pop_Variant6(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action0::<>(errors, input, __sym0); + return Some(Ok(__nt)); + } + _ => panic!("invalid action code {}", __action) + }; + let __states_len = __states.len(); + __states.truncate(__states_len - __pop_states); + let __state = *__states.last().unwrap(); + let __next_state = __goto(__state, __nonterminal); + __states.push(__next_state); + None + } + #[inline(never)] + fn __symbol_type_mismatch() -> ! { + panic!("symbol type mismatch") + } + fn __pop_Variant6< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, Box>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant7< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, CallOutput<'input>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant5< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, FunctionPart<'input>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant8< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, PeerPart<'input>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant2< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, Value<'input>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant4< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, Vec>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant1< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, __lalrpop_util::ErrorRecovery, InstructionError>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant3< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, ::std::vec::Vec>, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + fn __pop_Variant0< + 'input, + >( + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> + ) -> (usize, &'input str, usize) + { + match __symbols.pop() { + Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r), + _ => __symbol_type_mismatch() + } + } + pub(crate) fn __reduce0< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // () = Arg => ActionFn(28); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action28::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 0) + } + pub(crate) fn __reduce1< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // ()* = => ActionFn(26); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action26::<>(errors, input, &__start, &__end); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (0, 1) + } + pub(crate) fn __reduce2< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // ()* = ()+ => ActionFn(27); + let __sym0 = __pop_Variant3(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action27::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (1, 1) + } + pub(crate) fn __reduce3< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // ()+ = Arg => ActionFn(31); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action31::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (1, 2) + } + pub(crate) fn __reduce4< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // ()+ = ()+, Arg => ActionFn(32); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant2(__symbols); + let __sym0 = __pop_Variant3(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym1.2.clone(); + let __nt = super::__action32::<>(errors, input, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (2, 2) + } + pub(crate) fn __reduce5< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Alphanumeric = ALPHANUMERIC => ActionFn(25); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action25::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant0(__nt), __end)); + (1, 3) + } + pub(crate) fn __reduce6< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Arg = Value => ActionFn(19); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action19::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 4) + } + pub(crate) fn __reduce7< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Args = "[", "]" => ActionFn(33); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym1.2.clone(); + let __nt = super::__action33::<>(errors, input, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant4(__nt), __end)); + (2, 5) + } + pub(crate) fn __reduce8< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Args = "[", ()+, "]" => ActionFn(34); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant3(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym2.2.clone(); + let __nt = super::__action34::<>(errors, input, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant4(__nt), __end)); + (3, 5) + } + pub(crate) fn __reduce9< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // FPart = Function => ActionFn(10); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action10::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant5(__nt), __end)); + (1, 6) + } + pub(crate) fn __reduce10< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // FPart = "(", ServiceId, Function, ")" => ActionFn(11); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant2(__symbols); + let __sym1 = __pop_Variant2(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym3.2.clone(); + let __nt = super::__action11::<>(errors, input, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant5(__nt), __end)); + (4, 6) + } + pub(crate) fn __reduce11< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Function = Value => ActionFn(16); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action16::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 7) + } + pub(crate) fn __reduce12< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "seq", Instr, Instr, ")" => ActionFn(1); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant6(__symbols); + let __sym2 = __pop_Variant6(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action1::<>(errors, input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (5, 8) + } + pub(crate) fn __reduce13< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "par", Instr, Instr, ")" => ActionFn(2); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant6(__symbols); + let __sym2 = __pop_Variant6(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action2::<>(errors, input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (5, 8) + } + pub(crate) fn __reduce14< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "xor", Instr, Instr, ")" => ActionFn(3); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant6(__symbols); + let __sym2 = __pop_Variant6(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action3::<>(errors, input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (5, 8) + } + pub(crate) fn __reduce15< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "call", PeerPart, FPart, Args, Output, ")" => ActionFn(4); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant7(__symbols); + let __sym4 = __pop_Variant4(__symbols); + let __sym3 = __pop_Variant5(__symbols); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym6.2.clone(); + let __nt = super::__action4::<>(errors, input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (7, 8) + } + pub(crate) fn __reduce16< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "fold", Alphanumeric, Alphanumeric, Instr, ")" => ActionFn(5); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant6(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym5.2.clone(); + let __nt = super::__action5::<>(errors, input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (6, 8) + } + pub(crate) fn __reduce17< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "next", Alphanumeric, ")" => ActionFn(6); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym3.2.clone(); + let __nt = super::__action6::<>(errors, input, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (4, 8) + } + pub(crate) fn __reduce18< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = "(", "null", ")" => ActionFn(7); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym2.2.clone(); + let __nt = super::__action7::<>(errors, input, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (3, 8) + } + pub(crate) fn __reduce19< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Instr = error => ActionFn(8); + let __sym0 = __pop_Variant1(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action8::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant6(__nt), __end)); + (1, 8) + } + pub(crate) fn __reduce20< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Output = Alphanumeric => ActionFn(14); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action14::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant7(__nt), __end)); + (1, 9) + } + pub(crate) fn __reduce21< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Output = ACCUMULATOR => ActionFn(15); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action15::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant7(__nt), __end)); + (1, 9) + } + pub(crate) fn __reduce22< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // PeerId = Value => ActionFn(17); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action17::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 10) + } + pub(crate) fn __reduce23< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // PeerPart = PeerId => ActionFn(12); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action12::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (1, 11) + } + pub(crate) fn __reduce24< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // PeerPart = "(", PeerId, ServiceId, ")" => ActionFn(13); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant2(__symbols); + let __sym1 = __pop_Variant2(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym3.2.clone(); + let __nt = super::__action13::<>(errors, input, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (4, 11) + } + pub(crate) fn __reduce25< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // ServiceId = Value => ActionFn(18); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action18::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 12) + } + pub(crate) fn __reduce26< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Value = "\"", "\"" => ActionFn(20); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym1.2.clone(); + let __nt = super::__action20::<>(errors, input, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (2, 13) + } + pub(crate) fn __reduce27< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Value = "\"", Alphanumeric, "\"" => ActionFn(21); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym2.2.clone(); + let __nt = super::__action21::<>(errors, input, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (3, 13) + } + pub(crate) fn __reduce28< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Value = Alphanumeric => ActionFn(22); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action22::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 13) + } + pub(crate) fn __reduce29< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Value = JSON_PATH => ActionFn(23); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action23::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 13) + } + pub(crate) fn __reduce30< + 'input, + 'err, + >( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: ::std::marker::PhantomData<(&'input (), &'err ())>, + ) -> (usize, usize) + { + // Value = CURRENT_PEER_ID => ActionFn(24); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym0.2.clone(); + let __nt = super::__action24::<>(errors, input, __sym0); + __symbols.push((__start, __Symbol::Variant2(__nt), __end)); + (1, 13) + } +} +pub use self::__parse__Instr::InstrParser; +#[cfg_attr(rustfmt, rustfmt_skip)] +mod __intern_token { + #![allow(unused_imports)] + use crate::ast::*; + use crate::lalrpop::parser::InstructionError; + use lalrpop_util::ErrorRecovery; + use std::rc::Rc; + #[allow(unused_extern_crates)] + extern crate lalrpop_util as __lalrpop_util; + #[allow(unused_imports)] + use self::__lalrpop_util::state_machine as __state_machine; + pub fn new_builder() -> __lalrpop_util::lexer::MatcherBuilder { + let __strs: &[(&str, bool)] = &[ + ("^(\")", false), + ("^(\\()", false), + ("^(\\))", false), + ("^(\\[)", false), + ("^(\\])", false), + ("^([\\-0-9A-Z_a-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ\u{300}-ʹͶ-ͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ\u{483}-ԯԱ-Ֆՙՠ-ֈ\u{591}-\u{5bd}\u{5bf}\u{5c1}-\u{5c2}\u{5c4}-\u{5c5}\u{5c7}א-תׯ-ײ\u{610}-\u{61a}ؠ-٩ٮ-ۓە-\u{6dc}\u{6df}-\u{6e8}\u{6ea}-ۼۿܐ-\u{74a}ݍ-ޱ߀-ߵߺ\u{7fd}ࠀ-\u{82d}ࡀ-\u{85b}ࡠ-ࡪࢠ-ࢴࢶ-ࣇ\u{8d3}-\u{8e1}\u{8e3}-\u{963}०-९ॱ-ঃঅ-ঌএ-ঐও-নপ-রলশ-হ\u{9bc}-\u{9c4}ে-ৈো-ৎ\u{9d7}ড়-ঢ়য়-\u{9e3}০-ৱৼ\u{9fe}\u{a01}-ਃਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹ\u{a3c}ਾ-\u{a42}\u{a47}-\u{a48}\u{a4b}-\u{a4d}\u{a51}ਖ਼-ੜਫ਼੦-\u{a75}\u{a81}-ઃઅ-ઍએ-ઑઓ-નપ-રલ-ળવ-હ\u{abc}-\u{ac5}\u{ac7}-ૉો-\u{acd}ૐૠ-\u{ae3}૦-૯ૹ-\u{aff}\u{b01}-ଃଅ-ଌଏ-ଐଓ-ନପ-ରଲ-ଳଵ-ହ\u{b3c}-\u{b44}େ-ୈୋ-\u{b4d}\u{b55}-\u{b57}ଡ଼-ଢ଼ୟ-\u{b63}୦-୯ୱ\u{b82}-ஃஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-ஹ\u{bbe}-ூெ-ைொ-\u{bcd}ௐ\u{bd7}௦-௯\u{c00}-ఌఎ-ఐఒ-నప-హఽ-ౄ\u{c46}-\u{c48}\u{c4a}-\u{c4d}\u{c55}-\u{c56}ౘ-ౚౠ-\u{c63}౦-౯ಀ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ\u{cbc}-ೄ\u{cc6}-ೈೊ-\u{ccd}\u{cd5}-\u{cd6}ೞೠ-\u{ce3}೦-೯ೱ-ೲ\u{d00}-ഌഎ-ഐഒ-\u{d44}െ-ൈൊ-ൎൔ-\u{d57}ൟ-\u{d63}൦-൯ൺ-ൿ\u{d81}-ඃඅ-ඖක-නඳ-රලව-ෆ\u{dca}\u{dcf}-\u{dd4}\u{dd6}ෘ-\u{ddf}෦-෯ෲ-ෳก-\u{e3a}เ-\u{e4e}๐-๙ກ-ຂຄຆ-ຊຌ-ຣລວ-ຽເ-ໄໆ\u{ec8}-\u{ecd}໐-໙ໜ-ໟༀ\u{f18}-\u{f19}༠-༩\u{f35}\u{f37}\u{f39}༾-ཇཉ-ཬ\u{f71}-\u{f84}\u{f86}-\u{f97}\u{f99}-\u{fbc}\u{fc6}က-၉ၐ-\u{109d}Ⴀ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ\u{135d}-\u{135f}ᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-\u{1714}ᜠ-\u{1734}ᝀ-\u{1753}ᝠ-ᝬᝮ-ᝰ\u{1772}-\u{1773}ក-\u{17d3}ៗៜ-\u{17dd}០-៩\u{180b}-\u{180d}᠐-᠙ᠠ-ᡸᢀ-ᢪᢰ-ᣵᤀ-ᤞ\u{1920}-ᤫᤰ-\u{193b}᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-\u{1a1b}ᨠ-\u{1a5e}\u{1a60}-\u{1a7c}\u{1a7f}-᪉᪐-᪙ᪧ\u{1ab0}-\u{1ac0}\u{1b00}-ᭋ᭐-᭙\u{1b6b}-\u{1b73}\u{1b80}-᯳ᰀ-\u{1c37}᱀-᱉ᱍ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿ\u{1cd0}-\u{1cd2}\u{1cd4}-ᳺᴀ-\u{1df9}\u{1dfb}-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ\u{200c}-\u{200d}‿-⁀⁔ⁱⁿₐ-ₜ\u{20d0}-\u{20f0}ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⒶ-ⓩⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ\u{2d7f}-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ\u{2de0}-\u{2dff}ⸯ々-〇〡-\u{302f}〱-〵〸-〼ぁ-ゖ\u{3099}-\u{309a}ゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-鿼ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-\u{a672}\u{a674}-\u{a67d}ꙿ-\u{a6f1}ꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-ꟊꟵ-ꠧ\u{a82c}ꡀ-ꡳꢀ-\u{a8c5}꣐-꣙\u{a8e0}-ꣷꣻꣽ-\u{a92d}ꤰ-꥓ꥠ-ꥼ\u{a980}-꧀ꧏ-꧙ꧠ-ꧾꨀ-\u{aa36}ꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-\u{aaf6}ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯪ꯬-\u{abed}꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ\u{fe00}-\u{fe0f}\u{fe20}-\u{fe2f}︳-︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ𐀀-𐀋𐀍-𐀦𐀨-𐀺𐀼-𐀽𐀿-𐁍𐁐-𐁝𐂀-𐃺𐅀-𐅴\u{101fd}𐊀-𐊜𐊠-𐋐\u{102e0}𐌀-𐌟𐌭-𐍊𐍐-\u{1037a}𐎀-𐎝𐎠-𐏃𐏈-𐏏𐏑-𐏕𐐀-𐒝𐒠-𐒩𐒰-𐓓𐓘-𐓻𐔀-𐔧𐔰-𐕣𐘀-𐜶𐝀-𐝕𐝠-𐝧𐠀-𐠅𐠈𐠊-𐠵𐠷-𐠸𐠼𐠿-𐡕𐡠-𐡶𐢀-𐢞𐣠-𐣲𐣴-𐣵𐤀-𐤕𐤠-𐤹𐦀-𐦷𐦾-𐦿𐨀-\u{10a03}\u{10a05}-\u{10a06}\u{10a0c}-𐨓𐨕-𐨗𐨙-𐨵\u{10a38}-\u{10a3a}\u{10a3f}𐩠-𐩼𐪀-𐪜𐫀-𐫇𐫉-\u{10ae6}𐬀-𐬵𐭀-𐭕𐭠-𐭲𐮀-𐮑𐰀-𐱈𐲀-𐲲𐳀-𐳲𐴀-\u{10d27}𐴰-𐴹𐺀-𐺩\u{10eab}-\u{10eac}𐺰-𐺱𐼀-𐼜𐼧𐼰-\u{10f50}𐾰-𐿄𐿠-𐿶𑀀-\u{11046}𑁦-𑁯\u{1107f}-\u{110ba}𑃐-𑃨𑃰-𑃹\u{11100}-\u{11134}𑄶-𑄿𑅄-𑅇𑅐-\u{11173}𑅶\u{11180}-𑇄\u{111c9}-\u{111cc}𑇎-𑇚𑇜𑈀-𑈑𑈓-\u{11237}\u{1123e}𑊀-𑊆𑊈𑊊-𑊍𑊏-𑊝𑊟-𑊨𑊰-\u{112ea}𑋰-𑋹\u{11300}-𑌃𑌅-𑌌𑌏-𑌐𑌓-𑌨𑌪-𑌰𑌲-𑌳𑌵-𑌹\u{1133b}-𑍄𑍇-𑍈𑍋-𑍍𑍐\u{11357}𑍝-𑍣\u{11366}-\u{1136c}\u{11370}-\u{11374}𑐀-𑑊𑑐-𑑙\u{1145e}-𑑡𑒀-𑓅𑓇𑓐-𑓙𑖀-\u{115b5}𑖸-\u{115c0}𑗘-\u{115dd}𑘀-\u{11640}𑙄𑙐-𑙙𑚀-𑚸𑛀-𑛉𑜀-𑜚\u{1171d}-\u{1172b}𑜰-𑜹𑠀-\u{1183a}𑢠-𑣩𑣿-𑤆𑤉𑤌-𑤓𑤕-𑤖𑤘-𑤵𑤷-𑤸\u{1193b}-\u{11943}𑥐-𑥙𑦠-𑦧𑦪-\u{119d7}\u{119da}-𑧡𑧣-𑧤𑨀-\u{11a3e}\u{11a47}𑩐-\u{11a99}𑪝𑫀-𑫸𑰀-𑰈𑰊-\u{11c36}\u{11c38}-𑱀𑱐-𑱙𑱲-𑲏\u{11c92}-\u{11ca7}𑲩-\u{11cb6}𑴀-𑴆𑴈-𑴉𑴋-\u{11d36}\u{11d3a}\u{11d3c}-\u{11d3d}\u{11d3f}-\u{11d47}𑵐-𑵙𑵠-𑵥𑵧-𑵨𑵪-𑶎\u{11d90}-\u{11d91}𑶓-𑶘𑶠-𑶩𑻠-𑻶𑾰𒀀-𒎙𒐀-𒑮𒒀-𒕃𓀀-𓐮𔐀-𔙆𖠀-𖨸𖩀-𖩞𖩠-𖩩𖫐-𖫭\u{16af0}-\u{16af4}𖬀-\u{16b36}𖭀-𖭃𖭐-𖭙𖭣-𖭷𖭽-𖮏𖹀-𖹿𖼀-𖽊\u{16f4f}-𖾇\u{16f8f}-𖾟𖿠-𖿡𖿣-\u{16fe4}𖿰-𖿱𗀀-𘟷𘠀-𘳕𘴀-𘴈𛀀-𛄞𛅐-𛅒𛅤-𛅧𛅰-𛋻𛰀-𛱪𛱰-𛱼𛲀-𛲈𛲐-𛲙\u{1bc9d}-\u{1bc9e}\u{1d165}-\u{1d169}𝅭-\u{1d172}\u{1d17b}-\u{1d182}\u{1d185}-\u{1d18b}\u{1d1aa}-\u{1d1ad}\u{1d242}-\u{1d244}𝐀-𝑔𝑖-𝒜𝒞-𝒟𝒢𝒥-𝒦𝒩-𝒬𝒮-𝒹𝒻𝒽-𝓃𝓅-𝔅𝔇-𝔊𝔍-𝔔𝔖-𝔜𝔞-𝔹𝔻-𝔾𝕀-𝕄𝕆𝕊-𝕐𝕒-𝚥𝚨-𝛀𝛂-𝛚𝛜-𝛺𝛼-𝜔𝜖-𝜴𝜶-𝝎𝝐-𝝮𝝰-𝞈𝞊-𝞨𝞪-𝟂𝟄-𝟋𝟎-𝟿\u{1da00}-\u{1da36}\u{1da3b}-\u{1da6c}\u{1da75}\u{1da84}\u{1da9b}-\u{1da9f}\u{1daa1}-\u{1daaf}\u{1e000}-\u{1e006}\u{1e008}-\u{1e018}\u{1e01b}-\u{1e021}\u{1e023}-\u{1e024}\u{1e026}-\u{1e02a}𞄀-𞄬\u{1e130}-𞄽𞅀-𞅉𞅎𞋀-𞋹𞠀-𞣄\u{1e8d0}-\u{1e8d6}𞤀-𞥋𞥐-𞥙𞸀-𞸃𞸅-𞸟𞸡-𞸢𞸤𞸧𞸩-𞸲𞸴-𞸷𞸹𞸻𞹂𞹇𞹉𞹋𞹍-𞹏𞹑-𞹒𞹔𞹗𞹙𞹛𞹝𞹟𞹡-𞹢𞹤𞹧-𞹪𞹬-𞹲𞹴-𞹷𞹹-𞹼𞹾𞺀-𞺉𞺋-𞺛𞺡-𞺣𞺥-𞺩𞺫-𞺻🄰-🅉🅐-🅩🅰-🆉🯰-🯹𠀀-𪛝𪜀-𫜴𫝀-𫠝𫠠-𬺡𬺰-𮯠丽-𪘀𰀀-𱍊\u{e0100}-\u{e01ef}]+)", false), + ("^([\\-0-9A-Z_a-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ\u{300}-ʹͶ-ͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ\u{483}-ԯԱ-Ֆՙՠ-ֈ\u{591}-\u{5bd}\u{5bf}\u{5c1}-\u{5c2}\u{5c4}-\u{5c5}\u{5c7}א-תׯ-ײ\u{610}-\u{61a}ؠ-٩ٮ-ۓە-\u{6dc}\u{6df}-\u{6e8}\u{6ea}-ۼۿܐ-\u{74a}ݍ-ޱ߀-ߵߺ\u{7fd}ࠀ-\u{82d}ࡀ-\u{85b}ࡠ-ࡪࢠ-ࢴࢶ-ࣇ\u{8d3}-\u{8e1}\u{8e3}-\u{963}०-९ॱ-ঃঅ-ঌএ-ঐও-নপ-রলশ-হ\u{9bc}-\u{9c4}ে-ৈো-ৎ\u{9d7}ড়-ঢ়য়-\u{9e3}০-ৱৼ\u{9fe}\u{a01}-ਃਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹ\u{a3c}ਾ-\u{a42}\u{a47}-\u{a48}\u{a4b}-\u{a4d}\u{a51}ਖ਼-ੜਫ਼੦-\u{a75}\u{a81}-ઃઅ-ઍએ-ઑઓ-નપ-રલ-ળવ-હ\u{abc}-\u{ac5}\u{ac7}-ૉો-\u{acd}ૐૠ-\u{ae3}૦-૯ૹ-\u{aff}\u{b01}-ଃଅ-ଌଏ-ଐଓ-ନପ-ରଲ-ଳଵ-ହ\u{b3c}-\u{b44}େ-ୈୋ-\u{b4d}\u{b55}-\u{b57}ଡ଼-ଢ଼ୟ-\u{b63}୦-୯ୱ\u{b82}-ஃஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-ஹ\u{bbe}-ூெ-ைொ-\u{bcd}ௐ\u{bd7}௦-௯\u{c00}-ఌఎ-ఐఒ-నప-హఽ-ౄ\u{c46}-\u{c48}\u{c4a}-\u{c4d}\u{c55}-\u{c56}ౘ-ౚౠ-\u{c63}౦-౯ಀ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ\u{cbc}-ೄ\u{cc6}-ೈೊ-\u{ccd}\u{cd5}-\u{cd6}ೞೠ-\u{ce3}೦-೯ೱ-ೲ\u{d00}-ഌഎ-ഐഒ-\u{d44}െ-ൈൊ-ൎൔ-\u{d57}ൟ-\u{d63}൦-൯ൺ-ൿ\u{d81}-ඃඅ-ඖක-නඳ-රලව-ෆ\u{dca}\u{dcf}-\u{dd4}\u{dd6}ෘ-\u{ddf}෦-෯ෲ-ෳก-\u{e3a}เ-\u{e4e}๐-๙ກ-ຂຄຆ-ຊຌ-ຣລວ-ຽເ-ໄໆ\u{ec8}-\u{ecd}໐-໙ໜ-ໟༀ\u{f18}-\u{f19}༠-༩\u{f35}\u{f37}\u{f39}༾-ཇཉ-ཬ\u{f71}-\u{f84}\u{f86}-\u{f97}\u{f99}-\u{fbc}\u{fc6}က-၉ၐ-\u{109d}Ⴀ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ\u{135d}-\u{135f}ᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-\u{1714}ᜠ-\u{1734}ᝀ-\u{1753}ᝠ-ᝬᝮ-ᝰ\u{1772}-\u{1773}ក-\u{17d3}ៗៜ-\u{17dd}០-៩\u{180b}-\u{180d}᠐-᠙ᠠ-ᡸᢀ-ᢪᢰ-ᣵᤀ-ᤞ\u{1920}-ᤫᤰ-\u{193b}᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-\u{1a1b}ᨠ-\u{1a5e}\u{1a60}-\u{1a7c}\u{1a7f}-᪉᪐-᪙ᪧ\u{1ab0}-\u{1ac0}\u{1b00}-ᭋ᭐-᭙\u{1b6b}-\u{1b73}\u{1b80}-᯳ᰀ-\u{1c37}᱀-᱉ᱍ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿ\u{1cd0}-\u{1cd2}\u{1cd4}-ᳺᴀ-\u{1df9}\u{1dfb}-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ\u{200c}-\u{200d}‿-⁀⁔ⁱⁿₐ-ₜ\u{20d0}-\u{20f0}ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⒶ-ⓩⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ\u{2d7f}-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ\u{2de0}-\u{2dff}ⸯ々-〇〡-\u{302f}〱-〵〸-〼ぁ-ゖ\u{3099}-\u{309a}ゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-鿼ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-\u{a672}\u{a674}-\u{a67d}ꙿ-\u{a6f1}ꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-ꟊꟵ-ꠧ\u{a82c}ꡀ-ꡳꢀ-\u{a8c5}꣐-꣙\u{a8e0}-ꣷꣻꣽ-\u{a92d}ꤰ-꥓ꥠ-ꥼ\u{a980}-꧀ꧏ-꧙ꧠ-ꧾꨀ-\u{aa36}ꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-\u{aaf6}ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯪ꯬-\u{abed}꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ\u{fe00}-\u{fe0f}\u{fe20}-\u{fe2f}︳-︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ𐀀-𐀋𐀍-𐀦𐀨-𐀺𐀼-𐀽𐀿-𐁍𐁐-𐁝𐂀-𐃺𐅀-𐅴\u{101fd}𐊀-𐊜𐊠-𐋐\u{102e0}𐌀-𐌟𐌭-𐍊𐍐-\u{1037a}𐎀-𐎝𐎠-𐏃𐏈-𐏏𐏑-𐏕𐐀-𐒝𐒠-𐒩𐒰-𐓓𐓘-𐓻𐔀-𐔧𐔰-𐕣𐘀-𐜶𐝀-𐝕𐝠-𐝧𐠀-𐠅𐠈𐠊-𐠵𐠷-𐠸𐠼𐠿-𐡕𐡠-𐡶𐢀-𐢞𐣠-𐣲𐣴-𐣵𐤀-𐤕𐤠-𐤹𐦀-𐦷𐦾-𐦿𐨀-\u{10a03}\u{10a05}-\u{10a06}\u{10a0c}-𐨓𐨕-𐨗𐨙-𐨵\u{10a38}-\u{10a3a}\u{10a3f}𐩠-𐩼𐪀-𐪜𐫀-𐫇𐫉-\u{10ae6}𐬀-𐬵𐭀-𐭕𐭠-𐭲𐮀-𐮑𐰀-𐱈𐲀-𐲲𐳀-𐳲𐴀-\u{10d27}𐴰-𐴹𐺀-𐺩\u{10eab}-\u{10eac}𐺰-𐺱𐼀-𐼜𐼧𐼰-\u{10f50}𐾰-𐿄𐿠-𐿶𑀀-\u{11046}𑁦-𑁯\u{1107f}-\u{110ba}𑃐-𑃨𑃰-𑃹\u{11100}-\u{11134}𑄶-𑄿𑅄-𑅇𑅐-\u{11173}𑅶\u{11180}-𑇄\u{111c9}-\u{111cc}𑇎-𑇚𑇜𑈀-𑈑𑈓-\u{11237}\u{1123e}𑊀-𑊆𑊈𑊊-𑊍𑊏-𑊝𑊟-𑊨𑊰-\u{112ea}𑋰-𑋹\u{11300}-𑌃𑌅-𑌌𑌏-𑌐𑌓-𑌨𑌪-𑌰𑌲-𑌳𑌵-𑌹\u{1133b}-𑍄𑍇-𑍈𑍋-𑍍𑍐\u{11357}𑍝-𑍣\u{11366}-\u{1136c}\u{11370}-\u{11374}𑐀-𑑊𑑐-𑑙\u{1145e}-𑑡𑒀-𑓅𑓇𑓐-𑓙𑖀-\u{115b5}𑖸-\u{115c0}𑗘-\u{115dd}𑘀-\u{11640}𑙄𑙐-𑙙𑚀-𑚸𑛀-𑛉𑜀-𑜚\u{1171d}-\u{1172b}𑜰-𑜹𑠀-\u{1183a}𑢠-𑣩𑣿-𑤆𑤉𑤌-𑤓𑤕-𑤖𑤘-𑤵𑤷-𑤸\u{1193b}-\u{11943}𑥐-𑥙𑦠-𑦧𑦪-\u{119d7}\u{119da}-𑧡𑧣-𑧤𑨀-\u{11a3e}\u{11a47}𑩐-\u{11a99}𑪝𑫀-𑫸𑰀-𑰈𑰊-\u{11c36}\u{11c38}-𑱀𑱐-𑱙𑱲-𑲏\u{11c92}-\u{11ca7}𑲩-\u{11cb6}𑴀-𑴆𑴈-𑴉𑴋-\u{11d36}\u{11d3a}\u{11d3c}-\u{11d3d}\u{11d3f}-\u{11d47}𑵐-𑵙𑵠-𑵥𑵧-𑵨𑵪-𑶎\u{11d90}-\u{11d91}𑶓-𑶘𑶠-𑶩𑻠-𑻶𑾰𒀀-𒎙𒐀-𒑮𒒀-𒕃𓀀-𓐮𔐀-𔙆𖠀-𖨸𖩀-𖩞𖩠-𖩩𖫐-𖫭\u{16af0}-\u{16af4}𖬀-\u{16b36}𖭀-𖭃𖭐-𖭙𖭣-𖭷𖭽-𖮏𖹀-𖹿𖼀-𖽊\u{16f4f}-𖾇\u{16f8f}-𖾟𖿠-𖿡𖿣-\u{16fe4}𖿰-𖿱𗀀-𘟷𘠀-𘳕𘴀-𘴈𛀀-𛄞𛅐-𛅒𛅤-𛅧𛅰-𛋻𛰀-𛱪𛱰-𛱼𛲀-𛲈𛲐-𛲙\u{1bc9d}-\u{1bc9e}\u{1d165}-\u{1d169}𝅭-\u{1d172}\u{1d17b}-\u{1d182}\u{1d185}-\u{1d18b}\u{1d1aa}-\u{1d1ad}\u{1d242}-\u{1d244}𝐀-𝑔𝑖-𝒜𝒞-𝒟𝒢𝒥-𝒦𝒩-𝒬𝒮-𝒹𝒻𝒽-𝓃𝓅-𝔅𝔇-𝔊𝔍-𝔔𝔖-𝔜𝔞-𝔹𝔻-𝔾𝕀-𝕄𝕆𝕊-𝕐𝕒-𝚥𝚨-𝛀𝛂-𝛚𝛜-𝛺𝛼-𝜔𝜖-𝜴𝜶-𝝎𝝐-𝝮𝝰-𝞈𝞊-𝞨𝞪-𝟂𝟄-𝟋𝟎-𝟿\u{1da00}-\u{1da36}\u{1da3b}-\u{1da6c}\u{1da75}\u{1da84}\u{1da9b}-\u{1da9f}\u{1daa1}-\u{1daaf}\u{1e000}-\u{1e006}\u{1e008}-\u{1e018}\u{1e01b}-\u{1e021}\u{1e023}-\u{1e024}\u{1e026}-\u{1e02a}𞄀-𞄬\u{1e130}-𞄽𞅀-𞅉𞅎𞋀-𞋹𞠀-𞣄\u{1e8d0}-\u{1e8d6}𞤀-𞥋𞥐-𞥙𞸀-𞸃𞸅-𞸟𞸡-𞸢𞸤𞸧𞸩-𞸲𞸴-𞸷𞸹𞸻𞹂𞹇𞹉𞹋𞹍-𞹏𞹑-𞹒𞹔𞹗𞹙𞹛𞹝𞹟𞹡-𞹢𞹤𞹧-𞹪𞹬-𞹲𞹴-𞹷𞹹-𞹼𞹾𞺀-𞺉𞺋-𞺛𞺡-𞺣𞺥-𞺩𞺫-𞺻🄰-🅉🅐-🅩🅰-🆉🯰-🯹𠀀-𪛝𪜀-𫜴𫝀-𫠝𫠠-𬺡𬺰-𮯠丽-𪘀𰀀-𱍊\u{e0100}-\u{e01ef}]+\\.\\$[\u{0}-\u{1f}!-\u{10ffff}]+)", false), + ("^([\\-0-9A-Z_a-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ\u{300}-ʹͶ-ͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ\u{483}-ԯԱ-Ֆՙՠ-ֈ\u{591}-\u{5bd}\u{5bf}\u{5c1}-\u{5c2}\u{5c4}-\u{5c5}\u{5c7}א-תׯ-ײ\u{610}-\u{61a}ؠ-٩ٮ-ۓە-\u{6dc}\u{6df}-\u{6e8}\u{6ea}-ۼۿܐ-\u{74a}ݍ-ޱ߀-ߵߺ\u{7fd}ࠀ-\u{82d}ࡀ-\u{85b}ࡠ-ࡪࢠ-ࢴࢶ-ࣇ\u{8d3}-\u{8e1}\u{8e3}-\u{963}०-९ॱ-ঃঅ-ঌএ-ঐও-নপ-রলশ-হ\u{9bc}-\u{9c4}ে-ৈো-ৎ\u{9d7}ড়-ঢ়য়-\u{9e3}০-ৱৼ\u{9fe}\u{a01}-ਃਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹ\u{a3c}ਾ-\u{a42}\u{a47}-\u{a48}\u{a4b}-\u{a4d}\u{a51}ਖ਼-ੜਫ਼੦-\u{a75}\u{a81}-ઃઅ-ઍએ-ઑઓ-નપ-રલ-ળવ-હ\u{abc}-\u{ac5}\u{ac7}-ૉો-\u{acd}ૐૠ-\u{ae3}૦-૯ૹ-\u{aff}\u{b01}-ଃଅ-ଌଏ-ଐଓ-ନପ-ରଲ-ଳଵ-ହ\u{b3c}-\u{b44}େ-ୈୋ-\u{b4d}\u{b55}-\u{b57}ଡ଼-ଢ଼ୟ-\u{b63}୦-୯ୱ\u{b82}-ஃஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-ஹ\u{bbe}-ூெ-ைொ-\u{bcd}ௐ\u{bd7}௦-௯\u{c00}-ఌఎ-ఐఒ-నప-హఽ-ౄ\u{c46}-\u{c48}\u{c4a}-\u{c4d}\u{c55}-\u{c56}ౘ-ౚౠ-\u{c63}౦-౯ಀ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ\u{cbc}-ೄ\u{cc6}-ೈೊ-\u{ccd}\u{cd5}-\u{cd6}ೞೠ-\u{ce3}೦-೯ೱ-ೲ\u{d00}-ഌഎ-ഐഒ-\u{d44}െ-ൈൊ-ൎൔ-\u{d57}ൟ-\u{d63}൦-൯ൺ-ൿ\u{d81}-ඃඅ-ඖක-නඳ-රලව-ෆ\u{dca}\u{dcf}-\u{dd4}\u{dd6}ෘ-\u{ddf}෦-෯ෲ-ෳก-\u{e3a}เ-\u{e4e}๐-๙ກ-ຂຄຆ-ຊຌ-ຣລວ-ຽເ-ໄໆ\u{ec8}-\u{ecd}໐-໙ໜ-ໟༀ\u{f18}-\u{f19}༠-༩\u{f35}\u{f37}\u{f39}༾-ཇཉ-ཬ\u{f71}-\u{f84}\u{f86}-\u{f97}\u{f99}-\u{fbc}\u{fc6}က-၉ၐ-\u{109d}Ⴀ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ\u{135d}-\u{135f}ᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-\u{1714}ᜠ-\u{1734}ᝀ-\u{1753}ᝠ-ᝬᝮ-ᝰ\u{1772}-\u{1773}ក-\u{17d3}ៗៜ-\u{17dd}០-៩\u{180b}-\u{180d}᠐-᠙ᠠ-ᡸᢀ-ᢪᢰ-ᣵᤀ-ᤞ\u{1920}-ᤫᤰ-\u{193b}᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-\u{1a1b}ᨠ-\u{1a5e}\u{1a60}-\u{1a7c}\u{1a7f}-᪉᪐-᪙ᪧ\u{1ab0}-\u{1ac0}\u{1b00}-ᭋ᭐-᭙\u{1b6b}-\u{1b73}\u{1b80}-᯳ᰀ-\u{1c37}᱀-᱉ᱍ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿ\u{1cd0}-\u{1cd2}\u{1cd4}-ᳺᴀ-\u{1df9}\u{1dfb}-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ\u{200c}-\u{200d}‿-⁀⁔ⁱⁿₐ-ₜ\u{20d0}-\u{20f0}ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⒶ-ⓩⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ\u{2d7f}-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ\u{2de0}-\u{2dff}ⸯ々-〇〡-\u{302f}〱-〵〸-〼ぁ-ゖ\u{3099}-\u{309a}ゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-鿼ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-\u{a672}\u{a674}-\u{a67d}ꙿ-\u{a6f1}ꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-ꟊꟵ-ꠧ\u{a82c}ꡀ-ꡳꢀ-\u{a8c5}꣐-꣙\u{a8e0}-ꣷꣻꣽ-\u{a92d}ꤰ-꥓ꥠ-ꥼ\u{a980}-꧀ꧏ-꧙ꧠ-ꧾꨀ-\u{aa36}ꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-\u{aaf6}ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯪ꯬-\u{abed}꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ\u{fe00}-\u{fe0f}\u{fe20}-\u{fe2f}︳-︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ𐀀-𐀋𐀍-𐀦𐀨-𐀺𐀼-𐀽𐀿-𐁍𐁐-𐁝𐂀-𐃺𐅀-𐅴\u{101fd}𐊀-𐊜𐊠-𐋐\u{102e0}𐌀-𐌟𐌭-𐍊𐍐-\u{1037a}𐎀-𐎝𐎠-𐏃𐏈-𐏏𐏑-𐏕𐐀-𐒝𐒠-𐒩𐒰-𐓓𐓘-𐓻𐔀-𐔧𐔰-𐕣𐘀-𐜶𐝀-𐝕𐝠-𐝧𐠀-𐠅𐠈𐠊-𐠵𐠷-𐠸𐠼𐠿-𐡕𐡠-𐡶𐢀-𐢞𐣠-𐣲𐣴-𐣵𐤀-𐤕𐤠-𐤹𐦀-𐦷𐦾-𐦿𐨀-\u{10a03}\u{10a05}-\u{10a06}\u{10a0c}-𐨓𐨕-𐨗𐨙-𐨵\u{10a38}-\u{10a3a}\u{10a3f}𐩠-𐩼𐪀-𐪜𐫀-𐫇𐫉-\u{10ae6}𐬀-𐬵𐭀-𐭕𐭠-𐭲𐮀-𐮑𐰀-𐱈𐲀-𐲲𐳀-𐳲𐴀-\u{10d27}𐴰-𐴹𐺀-𐺩\u{10eab}-\u{10eac}𐺰-𐺱𐼀-𐼜𐼧𐼰-\u{10f50}𐾰-𐿄𐿠-𐿶𑀀-\u{11046}𑁦-𑁯\u{1107f}-\u{110ba}𑃐-𑃨𑃰-𑃹\u{11100}-\u{11134}𑄶-𑄿𑅄-𑅇𑅐-\u{11173}𑅶\u{11180}-𑇄\u{111c9}-\u{111cc}𑇎-𑇚𑇜𑈀-𑈑𑈓-\u{11237}\u{1123e}𑊀-𑊆𑊈𑊊-𑊍𑊏-𑊝𑊟-𑊨𑊰-\u{112ea}𑋰-𑋹\u{11300}-𑌃𑌅-𑌌𑌏-𑌐𑌓-𑌨𑌪-𑌰𑌲-𑌳𑌵-𑌹\u{1133b}-𑍄𑍇-𑍈𑍋-𑍍𑍐\u{11357}𑍝-𑍣\u{11366}-\u{1136c}\u{11370}-\u{11374}𑐀-𑑊𑑐-𑑙\u{1145e}-𑑡𑒀-𑓅𑓇𑓐-𑓙𑖀-\u{115b5}𑖸-\u{115c0}𑗘-\u{115dd}𑘀-\u{11640}𑙄𑙐-𑙙𑚀-𑚸𑛀-𑛉𑜀-𑜚\u{1171d}-\u{1172b}𑜰-𑜹𑠀-\u{1183a}𑢠-𑣩𑣿-𑤆𑤉𑤌-𑤓𑤕-𑤖𑤘-𑤵𑤷-𑤸\u{1193b}-\u{11943}𑥐-𑥙𑦠-𑦧𑦪-\u{119d7}\u{119da}-𑧡𑧣-𑧤𑨀-\u{11a3e}\u{11a47}𑩐-\u{11a99}𑪝𑫀-𑫸𑰀-𑰈𑰊-\u{11c36}\u{11c38}-𑱀𑱐-𑱙𑱲-𑲏\u{11c92}-\u{11ca7}𑲩-\u{11cb6}𑴀-𑴆𑴈-𑴉𑴋-\u{11d36}\u{11d3a}\u{11d3c}-\u{11d3d}\u{11d3f}-\u{11d47}𑵐-𑵙𑵠-𑵥𑵧-𑵨𑵪-𑶎\u{11d90}-\u{11d91}𑶓-𑶘𑶠-𑶩𑻠-𑻶𑾰𒀀-𒎙𒐀-𒑮𒒀-𒕃𓀀-𓐮𔐀-𔙆𖠀-𖨸𖩀-𖩞𖩠-𖩩𖫐-𖫭\u{16af0}-\u{16af4}𖬀-\u{16b36}𖭀-𖭃𖭐-𖭙𖭣-𖭷𖭽-𖮏𖹀-𖹿𖼀-𖽊\u{16f4f}-𖾇\u{16f8f}-𖾟𖿠-𖿡𖿣-\u{16fe4}𖿰-𖿱𗀀-𘟷𘠀-𘳕𘴀-𘴈𛀀-𛄞𛅐-𛅒𛅤-𛅧𛅰-𛋻𛰀-𛱪𛱰-𛱼𛲀-𛲈𛲐-𛲙\u{1bc9d}-\u{1bc9e}\u{1d165}-\u{1d169}𝅭-\u{1d172}\u{1d17b}-\u{1d182}\u{1d185}-\u{1d18b}\u{1d1aa}-\u{1d1ad}\u{1d242}-\u{1d244}𝐀-𝑔𝑖-𝒜𝒞-𝒟𝒢𝒥-𝒦𝒩-𝒬𝒮-𝒹𝒻𝒽-𝓃𝓅-𝔅𝔇-𝔊𝔍-𝔔𝔖-𝔜𝔞-𝔹𝔻-𝔾𝕀-𝕄𝕆𝕊-𝕐𝕒-𝚥𝚨-𝛀𝛂-𝛚𝛜-𝛺𝛼-𝜔𝜖-𝜴𝜶-𝝎𝝐-𝝮𝝰-𝞈𝞊-𝞨𝞪-𝟂𝟄-𝟋𝟎-𝟿\u{1da00}-\u{1da36}\u{1da3b}-\u{1da6c}\u{1da75}\u{1da84}\u{1da9b}-\u{1da9f}\u{1daa1}-\u{1daaf}\u{1e000}-\u{1e006}\u{1e008}-\u{1e018}\u{1e01b}-\u{1e021}\u{1e023}-\u{1e024}\u{1e026}-\u{1e02a}𞄀-𞄬\u{1e130}-𞄽𞅀-𞅉𞅎𞋀-𞋹𞠀-𞣄\u{1e8d0}-\u{1e8d6}𞤀-𞥋𞥐-𞥙𞸀-𞸃𞸅-𞸟𞸡-𞸢𞸤𞸧𞸩-𞸲𞸴-𞸷𞸹𞸻𞹂𞹇𞹉𞹋𞹍-𞹏𞹑-𞹒𞹔𞹗𞹙𞹛𞹝𞹟𞹡-𞹢𞹤𞹧-𞹪𞹬-𞹲𞹴-𞹷𞹹-𞹼𞹾𞺀-𞺉𞺋-𞺛𞺡-𞺣𞺥-𞺩𞺫-𞺻🄰-🅉🅐-🅩🅰-🆉🯰-🯹𠀀-𪛝𪜀-𫜴𫝀-𫠝𫠠-𬺡𬺰-𮯠丽-𪘀𰀀-𱍊\u{e0100}-\u{e01ef}]+\\[\\])", false), + ("^(%current_peer_id%)", false), + ("^(call)", false), + ("^(fold)", false), + ("^(next)", false), + ("^(null)", false), + ("^(par)", false), + ("^(seq)", false), + ("^(xor)", false), + (r"^(\s*)", true), + ]; + __lalrpop_util::lexer::MatcherBuilder::new(__strs.iter().copied()).unwrap() + } +} +pub use self::__lalrpop_util::lexer::Token; + +#[allow(unused_variables)] +fn __action0<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Box>, usize), +) -> Box> { + __0 +} + +#[allow(unused_variables)] +fn __action1<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, l, _): (usize, Box>, usize), + (_, r, _): (usize, Box>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Seq(Seq(l, r))) +} + +#[allow(unused_variables)] +fn __action2<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, l, _): (usize, Box>, usize), + (_, r, _): (usize, Box>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Par(Par(l, r))) +} + +#[allow(unused_variables)] +fn __action3<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, l, _): (usize, Box>, usize), + (_, r, _): (usize, Box>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Xor(Xor(l, r))) +} + +#[allow(unused_variables)] +fn __action4<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, peer, _): (usize, PeerPart<'input>, usize), + (_, f, _): (usize, FunctionPart<'input>, usize), + (_, args, _): (usize, Vec>, usize), + (_, output, _): (usize, CallOutput<'input>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Call(Call { + peer_part: peer, + function_part: f, + args, + output, + })) +} + +#[allow(unused_variables)] +fn __action5<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, iterable, _): (usize, &'input str, usize), + (_, iterator, _): (usize, &'input str, usize), + (_, i, _): (usize, Box>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + { + let instruction = Rc::new(*i); + Box::new(Instruction::Fold(Fold { + iterable, + iterator, + instruction, + })) + } +} + +#[allow(unused_variables)] +fn __action6<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, i, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Next(Next(i))) +} + +#[allow(unused_variables)] +fn __action7<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, &'input str, usize), + (_, __1, _): (usize, &'input str, usize), + (_, __2, _): (usize, &'input str, usize), +) -> Box> { + Box::new(Instruction::Null(Null)) +} + +#[allow(unused_variables)] +fn __action8<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): ( + usize, + __lalrpop_util::ErrorRecovery, InstructionError>, + usize, + ), +) -> Box> { + { + errors.push(__0); + Box::new(Instruction::Error) + } +} + +#[allow(unused_variables)] +fn __action9<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, args, _): (usize, ::std::vec::Vec>, usize), + (_, _, _): (usize, &'input str, usize), +) -> Vec> { + args +} + +#[allow(unused_variables)] +fn __action10<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, f, _): (usize, Value<'input>, usize), +) -> FunctionPart<'input> { + FunctionPart::FuncName(f) +} + +#[allow(unused_variables)] +fn __action11<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, sid, _): (usize, Value<'input>, usize), + (_, f, _): (usize, Value<'input>, usize), + (_, _, _): (usize, &'input str, usize), +) -> FunctionPart<'input> { + FunctionPart::ServiceIdWithFuncName(sid, f) +} + +#[allow(unused_variables)] +fn __action12<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, pid, _): (usize, Value<'input>, usize), +) -> PeerPart<'input> { + PeerPart::PeerPk(pid) +} + +#[allow(unused_variables)] +fn __action13<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, pid, _): (usize, Value<'input>, usize), + (_, sid, _): (usize, Value<'input>, usize), + (_, _, _): (usize, &'input str, usize), +) -> PeerPart<'input> { + PeerPart::PeerPkWithServiceId(pid, sid) +} + +#[allow(unused_variables)] +fn __action14<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, o, _): (usize, &'input str, usize), +) -> CallOutput<'input> { + CallOutput::Scalar(o) +} + +#[allow(unused_variables)] +fn __action15<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, o, _): (usize, &'input str, usize), +) -> CallOutput<'input> { + CallOutput::Accumulator(&o[..o.len() - 2]) +} + +#[allow(unused_variables)] +fn __action16<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> Value<'input> { + __0 +} + +#[allow(unused_variables)] +fn __action17<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> Value<'input> { + __0 +} + +#[allow(unused_variables)] +fn __action18<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> Value<'input> { + __0 +} + +#[allow(unused_variables)] +fn __action19<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> Value<'input> { + __0 +} + +#[allow(unused_variables)] +fn __action20<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, &'input str, usize), + (_, __1, _): (usize, &'input str, usize), +) -> Value<'input> { + Value::Literal("") +} + +#[allow(unused_variables)] +fn __action21<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, v, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), +) -> Value<'input> { + Value::Literal(v) +} + +#[allow(unused_variables)] +fn __action22<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, v, _): (usize, &'input str, usize), +) -> Value<'input> { + Value::Variable(v) +} + +#[allow(unused_variables)] +fn __action23<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, v, _): (usize, &'input str, usize), +) -> Value<'input> { + { + let mut path = v.splitn(2, "."); + let variable = path.next().expect("must contain dot"); + let path = path.next().expect("contain component after dot"); + Value::JsonPath { variable, path } + } +} + +#[allow(unused_variables)] +fn __action24<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, &'input str, usize), +) -> Value<'input> { + Value::CurrentPeerId +} + +#[allow(unused_variables)] +fn __action25<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, &'input str, usize), +) -> &'input str { + __0 +} + +#[allow(unused_variables)] +fn __action26<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __lookbehind: &usize, + __lookahead: &usize, +) -> ::std::vec::Vec> { + vec![] +} + +#[allow(unused_variables)] +fn __action27<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, v, _): (usize, ::std::vec::Vec>, usize), +) -> ::std::vec::Vec> { + v +} + +#[allow(unused_variables)] +fn __action28<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> Value<'input> { + __0 +} + +#[allow(unused_variables)] +fn __action29<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, __0, _): (usize, Value<'input>, usize), +) -> ::std::vec::Vec> { + vec![__0] +} + +#[allow(unused_variables)] +fn __action30<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + (_, v, _): (usize, ::std::vec::Vec>, usize), + (_, e, _): (usize, Value<'input>, usize), +) -> ::std::vec::Vec> { + { + let mut v = v; + v.push(e); + v + } +} + +#[allow(unused_variables)] +fn __action31<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __0: (usize, Value<'input>, usize), +) -> ::std::vec::Vec> { + let __start0 = __0.0.clone(); + let __end0 = __0.2.clone(); + let __temp0 = __action28(errors, input, __0); + let __temp0 = (__start0, __temp0, __end0); + __action29(errors, input, __temp0) +} + +#[allow(unused_variables)] +fn __action32<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __0: (usize, ::std::vec::Vec>, usize), + __1: (usize, Value<'input>, usize), +) -> ::std::vec::Vec> { + let __start0 = __1.0.clone(); + let __end0 = __1.2.clone(); + let __temp0 = __action28(errors, input, __1); + let __temp0 = (__start0, __temp0, __end0); + __action30(errors, input, __0, __temp0) +} + +#[allow(unused_variables)] +fn __action33<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __0: (usize, &'input str, usize), + __1: (usize, &'input str, usize), +) -> Vec> { + let __start0 = __0.2.clone(); + let __end0 = __1.0.clone(); + let __temp0 = __action26(errors, input, &__start0, &__end0); + let __temp0 = (__start0, __temp0, __end0); + __action9(errors, input, __0, __temp0, __1) +} + +#[allow(unused_variables)] +fn __action34<'input, 'err>( + errors: &'err mut Vec, InstructionError>>, + input: &'input str, + __0: (usize, &'input str, usize), + __1: (usize, ::std::vec::Vec>, usize), + __2: (usize, &'input str, usize), +) -> Vec> { + let __start0 = __1.0.clone(); + let __end0 = __1.2.clone(); + let __temp0 = __action27(errors, input, __1); + let __temp0 = (__start0, __temp0, __end0); + __action9(errors, input, __0, __temp0, __2) +} + +pub trait __ToTriple<'input, 'err> { + fn to_triple( + value: Self, + ) -> Result< + (usize, Token<'input>, usize), + __lalrpop_util::ParseError, InstructionError>, + >; +} + +impl<'input, 'err> __ToTriple<'input, 'err> for (usize, Token<'input>, usize) { + fn to_triple( + value: Self, + ) -> Result< + (usize, Token<'input>, usize), + __lalrpop_util::ParseError, InstructionError>, + > { + Ok(value) + } +} +impl<'input, 'err> __ToTriple<'input, 'err> + for Result<(usize, Token<'input>, usize), InstructionError> +{ + fn to_triple( + value: Self, + ) -> Result< + (usize, Token<'input>, usize), + __lalrpop_util::ParseError, InstructionError>, + > { + match value { + Ok(v) => Ok(v), + Err(error) => Err(__lalrpop_util::ParseError::User { error }), + } + } +} diff --git a/crates/air-parser/src/lalrpop/parser.rs b/crates/air-parser/src/lalrpop/parser.rs new file mode 100644 index 00000000..1bc1bbd6 --- /dev/null +++ b/crates/air-parser/src/lalrpop/parser.rs @@ -0,0 +1,119 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use super::aqua; +use crate::ast::Instruction; +use crate::lalrpop::aqua::Token; + +use codespan_reporting::diagnostic::{Diagnostic, Label}; +use codespan_reporting::files::SimpleFiles; +use codespan_reporting::term; +use codespan_reporting::term::termcolor::{Buffer, ColorChoice, StandardStream}; +use lalrpop_util::{ErrorRecovery, ParseError}; + +use std::fmt::Formatter; + +#[derive(Debug)] +/// Represents custom parsing errors. Isn't used yet. +pub enum InstructionError { + #[allow(dead_code)] + InvalidPeerId, +} + +impl std::error::Error for InstructionError {} +impl std::fmt::Display for InstructionError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "InstructionError") + } +} + +// Caching parser to cache internal regexes, which are expensive to instantiate +// See also https://github.com/lalrpop/lalrpop/issues/269 +thread_local!(static PARSER: aqua::InstrParser = aqua::InstrParser::new()); + +/// Parse AIR `source_code` to `Box` +pub fn parse(source_code: &str) -> Result, String> { + let mut files = SimpleFiles::new(); + let file_id = files.add("script.aqua", source_code); + + PARSER.with(|parser| { + let mut errors = Vec::new(); + match parser.parse(&mut errors, source_code) { + Ok(r) if errors.is_empty() => Ok(r), + Ok(_) => Err(report_errors(file_id, files, errors)), + Err(err) => Err(report_errors( + file_id, + files, + vec![ErrorRecovery { + error: err, + dropped_tokens: vec![], + }], + )), + } + }) +} + +fn report_errors( + file_id: usize, + files: SimpleFiles<&str, &str>, + errors: Vec>, +) -> String { + let labels: Vec> = errors + .into_iter() + .map(|err| match err.error { + ParseError::UnrecognizedToken { + token: (start, _, end), + expected, + } => Label::primary(file_id, start..end) + .with_message(format!("expected {}", pretty_expected(expected))), + ParseError::InvalidToken { location } => { + Label::primary(file_id, location..(location + 1)).with_message("unexpected token") + } + ParseError::ExtraToken { + token: (start, _, end), + } => Label::primary(file_id, start..end).with_message("extra token"), + ParseError::UnrecognizedEOF { location, expected } => { + Label::primary(file_id, location..(location + 1)) + .with_message(format!("expected {}", pretty_expected(expected))) + } + // TODO: capture start & end in user error; maybe return it as a separate Diagnostic::error? + ParseError::User { error } => { + Label::primary(file_id, 0..0).with_message(error.to_string()) + } + }) + .collect(); + let diagnostic = Diagnostic::error().with_labels(labels); + let config = codespan_reporting::term::Config::default(); + + // Write to stderr + let writer = StandardStream::stderr(ColorChoice::Auto); + term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect("term emit to stderr"); + + // Return as a string + let mut buffer = Buffer::no_color(); + term::emit(&mut buffer, &config, &files, &diagnostic).expect("term emit to buffer"); + String::from_utf8_lossy(buffer.as_slice()) + .as_ref() + .to_string() +} + +fn pretty_expected(expected: Vec) -> String { + if expected.is_empty() { + "".to_string() + } else { + expected.join(" or ") + } +} diff --git a/crates/air-parser/src/lalrpop/tests.rs b/crates/air-parser/src/lalrpop/tests.rs new file mode 100644 index 00000000..417a263b --- /dev/null +++ b/crates/air-parser/src/lalrpop/tests.rs @@ -0,0 +1,364 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use crate::ast::*; +use CallOutput::*; +use FunctionPart::*; +use PeerPart::*; +use Value::*; + +use fstrings::f; + +fn parse(source_code: &str) -> Instruction { + *super::parse(source_code).expect("parsing failed") +} + +#[test] +fn parse_seq() { + let source_code = r#" + (seq + (call peerid function [] void) + (call "id" "f" ["hello" name] void[]) + ) + "#; + let instruction = parse(source_code); + let expected = seq( + Instruction::Call(Call { + peer_part: PeerPk(Variable("peerid")), + function_part: FuncName(Variable("function")), + args: vec![], + output: Scalar("void"), + }), + Instruction::Call(Call { + peer_part: PeerPk(Literal("id")), + function_part: FuncName(Literal("f")), + args: vec![Literal("hello"), Variable("name")], + output: Accumulator("void"), + }), + ); + assert_eq!(instruction, expected); +} + +#[test] +fn parse_seq_seq() { + let source_code = r#" + (seq + (seq + (call peerid function [] void) + (call (peerid serviceA) ("serviceB" function) [] void) + ) + (call "id" "f" ["hello" name] void[]) + ) + "#; + let instruction = parse(source_code); + let expected = seq( + seq( + Instruction::Call(Call { + peer_part: PeerPk(Variable("peerid")), + function_part: FuncName(Variable("function")), + args: vec![], + output: Scalar("void"), + }), + Instruction::Call(Call { + peer_part: PeerPkWithServiceId(Variable("peerid"), Variable("serviceA")), + function_part: ServiceIdWithFuncName(Literal("serviceB"), Variable("function")), + args: vec![], + output: Scalar("void"), + }), + ), + Instruction::Call(Call { + peer_part: PeerPk(Literal("id")), + function_part: FuncName(Literal("f")), + args: vec![Literal("hello"), Variable("name")], + output: Accumulator("void"), + }), + ); + assert_eq!(instruction, expected); +} + +#[test] +fn parse_json_path() { + let source_code = r#" + (call id.$.a "f" ["hello" name] void[]) + "#; + let instruction = parse(source_code); + let expected = Instruction::Call(Call { + peer_part: PeerPk(JsonPath { + variable: "id", + path: "$.a", + }), + function_part: FuncName(Literal("f")), + args: vec![Literal("hello"), Variable("name")], + output: Accumulator("void"), + }); + assert_eq!(instruction, expected); +} + +#[test] +fn parse_json_path_complex() { + let source_code = r#" + (seq + (call m.$.[1] "f" [] void) + (call m.$.abc.cde[a][0].cde "f" [] void) + ) + "#; + let instruction = parse(source_code); + let expected = seq( + Instruction::Call(Call { + peer_part: PeerPk(JsonPath { + variable: "m", + path: "$.[1]", + }), + function_part: FuncName(Literal("f")), + args: vec![], + output: Scalar("void"), + }), + Instruction::Call(Call { + peer_part: PeerPk(JsonPath { + variable: "m", + path: "$.abc.cde[a][0].cde", + }), + function_part: FuncName(Literal("f")), + args: vec![], + output: Scalar("void"), + }), + ); + assert_eq!(instruction, expected); +} + +#[test] +fn parse_null() { + let source_code = r#" + (seq + (null) + + ( null ) + ) + "#; + let instruction = parse(source_code); + let expected = Instruction::Seq(Seq(Box::new(null()), Box::new(null()))); + assert_eq!(instruction, expected) +} + +fn source_seq_with(name: &'static str) -> String { + f!(r#" + (seq + ({name} + (seq (null) (null)) + (null) + ) + ({name} (null) (seq (null) (null)) ) + ) + "#) +} + +#[test] +fn parse_seq_par_xor_seq() { + for name in &["xor", "par", "seq"] { + let source_code = source_seq_with(name); + let instruction = parse(&source_code.as_ref()); + let instr = binary_instruction(*name); + let expected = seq(instr(seqnn(), null()), instr(null(), seqnn())); + assert_eq!(instruction, expected); + } +} + +#[test] +fn parse_fold() { + let source_code = r#" + (fold iterable i + (null) + ) + "#; + let instruction = parse(&source_code.as_ref()); + let expected = fold("iterable", "i", null()); + assert_eq!(instruction, expected); +} + +fn source_fold_with(name: &str) -> String { + f!(r#"(fold iterable i + ({name} (null) (null)) + )"#) +} +#[test] +fn parse_fold_with_xor_par_seq() { + for name in &["xor", "par", "seq"] { + let source_code = source_fold_with(name); + let instruction = parse(&source_code.as_ref()); + let instr = binary_instruction(*name); + let expected = fold("iterable", "i", instr(null(), null())); + assert_eq!(instruction, expected); + } +} + +#[test] +fn seq_par_call() { + let source_code = r#" + (seq + (par + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_1) + (call "remote_peer_id" ("service_id" "fn_name") [] g) + ) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_2) + )"#; + let instruction = parse(&source_code.as_ref()); + let expected = seq( + par( + Instruction::Call(Call { + peer_part: PeerPk(CurrentPeerId), + function_part: ServiceIdWithFuncName( + Literal("local_service_id"), + Literal("local_fn_name"), + ), + args: vec![], + output: Scalar("result_1"), + }), + Instruction::Call(Call { + peer_part: PeerPk(Literal("remote_peer_id")), + function_part: ServiceIdWithFuncName(Literal("service_id"), Literal("fn_name")), + args: vec![], + output: Scalar("g"), + }), + ), + Instruction::Call(Call { + peer_part: PeerPk(CurrentPeerId), + function_part: ServiceIdWithFuncName( + Literal("local_service_id"), + Literal("local_fn_name"), + ), + args: vec![], + output: Scalar("result_2"), + }), + ); + assert_eq!(instruction, expected); +} + +#[test] +fn seq_with_empty_and_dash() { + let source_code = r#" + (seq + (seq + (seq + (call "set_variables" ("" "") ["module-bytes"] module-bytes) + (call "set_variables" ("" "") ["module_config"] module_config) + ) + (call "set_variables" ("" "") ["blueprint"] blueprint) + ) + (seq + (call "A" ("add_module" "") [module-bytes module_config] module) + (seq + (call "A" ("add_blueprint" "") [blueprint] blueprint_id) + (seq + (call "A" ("create" "") [blueprint_id] service_id) + (call "remote_peer_id" ("" "") [service_id] client_result) + ) + ) + ) + ) + "#; + let instruction = parse(&source_code.as_ref()); + let expected = seq( + seq( + seq( + Instruction::Call(Call { + peer_part: PeerPk(Literal("set_variables")), + function_part: ServiceIdWithFuncName(Literal(""), Literal("")), + args: vec![Literal("module-bytes")], + output: Scalar("module-bytes"), + }), + Instruction::Call(Call { + peer_part: PeerPk(Literal("set_variables")), + function_part: ServiceIdWithFuncName(Literal(""), Literal("")), + args: vec![Literal("module_config")], + output: Scalar("module_config"), + }), + ), + Instruction::Call(Call { + peer_part: PeerPk(Literal("set_variables")), + function_part: ServiceIdWithFuncName(Literal(""), Literal("")), + args: vec![Literal("blueprint")], + output: Scalar("blueprint"), + }), + ), + seq( + Instruction::Call(Call { + peer_part: PeerPk(Literal("A")), + function_part: ServiceIdWithFuncName(Literal("add_module"), Literal("")), + args: vec![Variable("module-bytes"), Variable("module_config")], + output: Scalar("module"), + }), + seq( + Instruction::Call(Call { + peer_part: PeerPk(Literal("A")), + function_part: ServiceIdWithFuncName(Literal("add_blueprint"), Literal("")), + args: vec![Variable("blueprint")], + output: Scalar("blueprint_id"), + }), + seq( + Instruction::Call(Call { + peer_part: PeerPk(Literal("A")), + function_part: ServiceIdWithFuncName(Literal("create"), Literal("")), + args: vec![Variable("blueprint_id")], + output: Scalar("service_id"), + }), + Instruction::Call(Call { + peer_part: PeerPk(Literal("remote_peer_id")), + function_part: ServiceIdWithFuncName(Literal(""), Literal("")), + args: vec![Variable("service_id")], + output: Scalar("client_result"), + }), + ), + ), + ), + ); + + assert_eq!(instruction, expected); +} + +// Test DSL + +fn seq<'a>(l: Instruction<'a>, r: Instruction<'a>) -> Instruction<'a> { + Instruction::Seq(Seq(Box::new(l), Box::new(r))) +} +fn par<'a>(l: Instruction<'a>, r: Instruction<'a>) -> Instruction<'a> { + Instruction::Par(Par(Box::new(l), Box::new(r))) +} +fn xor<'a>(l: Instruction<'a>, r: Instruction<'a>) -> Instruction<'a> { + Instruction::Xor(Xor(Box::new(l), Box::new(r))) +} +fn seqnn() -> Instruction<'static> { + seq(null(), null()) +} +fn null() -> Instruction<'static> { + Instruction::Null(Null) +} +fn fold<'a>(iterable: &'a str, iterator: &'a str, instruction: Instruction<'a>) -> Instruction<'a> { + Instruction::Fold(Fold { + iterable, + iterator, + instruction: std::rc::Rc::new(instruction), + }) +} +fn binary_instruction<'a, 'b>( + name: &'a str, +) -> impl Fn(Instruction<'b>, Instruction<'b>) -> Instruction<'b> { + match name { + "xor" => |l, r| xor(l, r), + "par" => |l, r| par(l, r), + "seq" => |l, r| seq(l, r), + _ => unreachable!(), + } +} diff --git a/crates/air-parser/src/lib.rs b/crates/air-parser/src/lib.rs new file mode 100644 index 00000000..4ab68609 --- /dev/null +++ b/crates/air-parser/src/lib.rs @@ -0,0 +1,20 @@ +#![deny(unused_imports, unused_variables, dead_code)] + +#[cfg(test)] +#[macro_use] +extern crate fstrings; + +pub mod ast; +mod lalrpop { + #[cfg(test)] + mod tests; + + // aqua is auto-generated, so exclude it from `cargo fmt -- --check` + #[rustfmt::skip] + mod aqua; + mod parser; + + pub use parser::parse; +} + +pub use lalrpop::parse; diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs index f591694b..f9342d42 100644 --- a/crates/test-utils/src/lib.rs +++ b/crates/test-utils/src/lib.rs @@ -147,7 +147,9 @@ pub fn set_variables_call_service(ret_mapping: HashMap) -> HostE #[macro_export] macro_rules! call_vm { ($vm:expr, $init_user_id:expr, $script:expr, $prev_data:expr, $data:expr) => { - $vm.call_with_prev_data($init_user_id, $script, $prev_data, $data) - .expect("call should be successful"); + match $vm.call_with_prev_data($init_user_id, $script, $prev_data, $data) { + Ok(v) => v, + Err(err) => panic!("VM call failed: {}", err), + } }; } diff --git a/stepper-lib/Cargo.toml b/stepper-lib/Cargo.toml index 1362bc36..94e94fdc 100644 --- a/stepper-lib/Cargo.toml +++ b/stepper-lib/Cargo.toml @@ -9,11 +9,11 @@ name = "stepper_lib" path = "src/lib.rs" [dependencies] +air-parser = { path = "../crates/air-parser" } fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["logger"] } serde = { version = "1.0.116", features = [ "derive", "rc" ] } serde_derive = "1.0.116" -serde_sexpr = "0.1.0" jsonpath_lib = "0.2.5" diff --git a/stepper-lib/benches/call_benchmark.rs b/stepper-lib/benches/call_benchmark.rs index e7515b01..957d646a 100644 --- a/stepper-lib/benches/call_benchmark.rs +++ b/stepper-lib/benches/call_benchmark.rs @@ -13,7 +13,7 @@ use std::cell::RefCell; thread_local!(static VM: RefCell = RefCell::new(create_aqua_vm(unit_call_service(), "test_peer_id"))); thread_local!(static SCRIPT: String = String::from( r#" - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_name)) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_name) "#, ) ); diff --git a/stepper-lib/benches/chat_benchmark.rs b/stepper-lib/benches/chat_benchmark.rs index d6722e42..1dfeadb9 100644 --- a/stepper-lib/benches/chat_benchmark.rs +++ b/stepper-lib/benches/chat_benchmark.rs @@ -34,24 +34,24 @@ thread_local!(static CLIENT_2_VM: RefCell = RefCell::new(create_aq fn chat_sent_message_benchmark() -> Result { let script = String::from( r#" - (seq ( - (call ("Relay1" ("identity" "") () void1[])) - (seq ( - (call ("Remote" ("552196ea-b9b2-4761-98d4-8e7dba77fac4" "add") () void2[])) - (seq ( - (call ("Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") () members)) - (fold (members m - (par ( - (seq ( - (call (m.$.[1] ("identity" "") () void[])) - (call (m.$.[0] ("fgemb3" "add") () void3[])) - )) + (seq + (call "Relay1" ("identity" "") [] void1[]) + (seq + (call "Remote" ("552196ea-b9b2-4761-98d4-8e7dba77fac4" "add") [] void2[]) + (seq + (call "Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") [] members) + (fold members m + (par + (seq + (call m.$.[1] ("identity" "") [] void[]) + (call m.$.[0] ("fgemb3" "add") [] void3[]) + ) (next m) - )) - )) - )) - )) - )) + ) + ) + ) + ) + ) "#, ); diff --git a/stepper-lib/benches/create_service_benchmark.rs b/stepper-lib/benches/create_service_benchmark.rs index c42ec699..52b69b32 100644 --- a/stepper-lib/benches/create_service_benchmark.rs +++ b/stepper-lib/benches/create_service_benchmark.rs @@ -71,25 +71,25 @@ thread_local!(static SET_VARIABLES_VM: RefCell = RefCell::new({ fn create_service_benchmark() -> Result { let script = String::from( r#" - (seq ( - (seq ( - (seq ( - (call ("set_variables" ("" "") ("module_bytes") module_bytes)) - (call ("set_variables" ("" "") ("module_config") module_config)) - )) - (call ("set_variables" ("" "") ("blueprint") blueprint)) - )) - (seq ( - (call ("A" ("add_module" "") (module_bytes module_config) module)) - (seq ( - (call ("A" ("add_blueprint" "") (blueprint) blueprint_id)) - (seq ( - (call ("A" ("create" "") (blueprint_id) service_id)) - (call ("remote_peer_id" ("" "") (service_id) client_result)) - )) - )) - )) - ))"#, + (seq + (seq + (seq + (call "set_variables" ("" "") ["module_bytes"] module_bytes) + (call "set_variables" ("" "") ["module_config"] module_config) + ) + (call "set_variables" ("" "") ["blueprint"] blueprint) + ) + (seq + (call "A" ("add_module" "") [module_bytes module_config] module) + (seq + (call "A" ("add_blueprint" "") [blueprint] blueprint_id) + (seq + (call "A" ("create" "") [blueprint_id] service_id) + (call "remote_peer_id" ("" "") [service_id] client_result) + ) + ) + ) + )"#, ); let res = SET_VARIABLES_VM diff --git a/stepper-lib/src/air/call.rs b/stepper-lib/src/air/call.rs index 4609c935..0a7fd0f7 100644 --- a/stepper-lib/src/air/call.rs +++ b/stepper-lib/src/air/call.rs @@ -15,6 +15,7 @@ */ mod parsed_call; +mod triplet; mod utils; use parsed_call::ParsedCall; @@ -26,10 +27,7 @@ use crate::AquamarineError::VariableNotFound; use crate::AquamarineError::VariableNotInJsonPath; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; - -const CURRENT_PEER_ALIAS: &str = "%current_peer_id%"; +use air_parser::ast::Call; /* (current) @@ -42,25 +40,8 @@ const CURRENT_PEER_ALIAS: &str = "%current_peer_id%"; FN_PART: resolves to (fn_name) \/ (fn_srv_id, fn_name) */ -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -pub(self) enum PeerPart { - PeerPk(String), - PeerPkWithServiceId(String, String), -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -pub(self) enum FunctionPart { - FuncName(String), - ServiceIdWithFuncName(String, String), -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Call(PeerPart, FunctionPart, Vec, String); - -impl super::ExecutableInstruction for Call { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Call<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { log_instruction!(call, exec_ctx, call_ctx); let parsed_call = match ParsedCall::new(self, exec_ctx) { @@ -113,7 +94,7 @@ mod tests { let script = String::from( r#" - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_name)) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_name) "#, ); @@ -129,7 +110,7 @@ mod tests { let script = String::from( r#" - (call ("test_peer_id" ("local_service_id" "local_fn_name") () result_name)) + (call "test_peer_id" ("local_service_id" "local_fn_name") [] result_name) "#, ); @@ -154,7 +135,7 @@ mod tests { let remote_peer_id = String::from("some_remote_peer_id"); let script = format!( - r#"(call ("{}" ("local_service_id" "local_fn_name") (value) result_name))"#, + r#"(call "{}" ("local_service_id" "local_fn_name") [value] result_name)"#, remote_peer_id ); @@ -173,10 +154,10 @@ mod tests { let script = format!( r#" - (seq ( - (call ("set_variable" ("some_service_id" "local_fn_name") () remote_peer_id)) - (call (remote_peer_id ("some_service_id" "local_fn_name") () result_name)) - )) + (seq + (call "set_variable" ("some_service_id" "local_fn_name") [] remote_peer_id) + (call remote_peer_id ("some_service_id" "local_fn_name") [] result_name) + ) "#, ); @@ -207,10 +188,10 @@ mod tests { let script = String::from( r#" - (seq ( - (call ("set_variable" ("some_service_id" "local_fn_name") () arg3)) - (call ("A" ("some_service_id" "local_fn_name") ("arg1" "arg2" arg3) result)) - )) + (seq + (call "set_variable" ("some_service_id" "local_fn_name") [] arg3) + (call "A" ("some_service_id" "local_fn_name") ["arg1" "arg2" arg3] result) + ) "#, ); diff --git a/stepper-lib/src/air/call/parsed_call.rs b/stepper-lib/src/air/call/parsed_call.rs index 9b241d6f..20748e16 100644 --- a/stepper-lib/src/air/call/parsed_call.rs +++ b/stepper-lib/src/air/call/parsed_call.rs @@ -16,63 +16,62 @@ #![allow(unused_unsafe)] // for wasm_bindgen target where calling FFI is safe -use super::utils::find_by_json_path; -use super::utils::is_string_literal; -use super::utils::set_local_call_result; +use super::triplet::{ResolvedTriplet, Triplet}; +use super::utils::{resolve_jvalue, set_local_call_result, set_remote_call_result}; use super::Call; -use super::CURRENT_PEER_ALIAS; + use crate::air::ExecutionCtx; use crate::build_targets::CALL_SERVICE_SUCCESS; -use crate::call_evidence::CallEvidenceCtx; -use crate::call_evidence::CallResult; -use crate::call_evidence::EvidenceState; +use crate::call_evidence::{CallEvidenceCtx, CallResult, EvidenceState}; use crate::log_targets::EVIDENCE_CHANGING; -use crate::AValue; use crate::AquamarineError; use crate::JValue; use crate::Result; -use std::borrow::Cow; +use air_parser::ast::{CallOutput, Value}; + use std::rc::Rc; #[derive(Debug, PartialEq, Eq)] -pub(super) struct ParsedCall { +pub(super) struct ParsedCall<'i> { peer_pk: String, service_id: String, function_name: String, - function_arg_paths: Vec, - result_variable_name: String, + function_arg_paths: Vec>, + output: CallOutput<'i>, } -impl ParsedCall { - pub(super) fn new(raw_call: &Call, exec_ctx: &ExecutionCtx) -> Result { - let (peer_pk, service_id, function_name) = prepare_peer_fn_parts(raw_call, exec_ctx)?; - let result_variable_name = parse_result_variable_name(raw_call)?; +impl<'i> ParsedCall<'i> { + /// Builds `ParsedCall` from `Call` by transforming `PeerPart` & `FunctionPart` into `ResolvedTriplet` + pub(super) fn new(raw_call: &Call<'i>, exec_ctx: &ExecutionCtx<'i>) -> Result { + let triplet = Triplet::try_from(&raw_call.peer_part, &raw_call.function_part)?; + #[rustfmt::skip] + let ResolvedTriplet { peer_pk, service_id, function_name } = triplet.resolve(exec_ctx)?; Ok(Self { peer_pk, service_id, function_name, - function_arg_paths: raw_call.2.clone(), - result_variable_name: result_variable_name.to_string(), + function_arg_paths: raw_call.args.clone(), + output: raw_call.output.clone(), }) } - pub(super) fn execute(self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { - let should_executed = self.prepare_evidence_state(exec_ctx, call_ctx)?; - if !should_executed { + pub(super) fn execute(self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { + let should_execute = self.prepare_evidence_state(exec_ctx, call_ctx)?; + if !should_execute { return Ok(()); } - if self.peer_pk != exec_ctx.current_peer_id && self.peer_pk != CURRENT_PEER_ALIAS { - super::utils::set_remote_call_result(self.peer_pk, exec_ctx, call_ctx); + if self.peer_pk != exec_ctx.current_peer_id { + set_remote_call_result(self.peer_pk, exec_ctx, call_ctx); return Ok(()); } - let function_args = extract_args_by_paths(&self.function_arg_paths, exec_ctx)?; - let function_args = serde_json::to_string(&function_args) - .map_err(|e| AquamarineError::FuncArgsSerializationError(function_args, e))?; + let function_args = self.function_arg_paths.iter(); + let function_args: Result> = function_args.map(|v| resolve_jvalue(v, exec_ctx)).collect(); + let function_args = JValue::Array(function_args?).to_string(); let result = unsafe { crate::call_service(self.service_id, self.function_name, function_args) }; @@ -88,7 +87,7 @@ impl ParsedCall { let result: JValue = serde_json::from_str(&result.result) .map_err(|e| AquamarineError::CallServiceResultDeserializationError(result, e))?; let result = Rc::new(result); - super::utils::set_local_call_result(self.result_variable_name, exec_ctx, result.clone())?; + set_local_call_result(self.output, exec_ctx, result.clone())?; let new_evidence_state = EvidenceState::Call(CallResult::Executed(result)); log::info!( @@ -103,7 +102,7 @@ impl ParsedCall { pub(super) fn prepare_evidence_state( &self, - exec_ctx: &mut ExecutionCtx, + exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx, ) -> Result { use crate::call_evidence::CallResult::*; @@ -147,7 +146,7 @@ impl ParsedCall { } // this instruction's been already executed Call(Executed(result)) => { - set_local_call_result(self.result_variable_name.clone(), exec_ctx, result.clone())?; + set_local_call_result(self.output.clone(), exec_ctx, result.clone())?; call_ctx.new_path.push_back(prev_state); Ok(false) } @@ -159,132 +158,3 @@ impl ParsedCall { } } } - -fn prepare_peer_fn_parts<'a>(raw_call: &'a Call, exec_ctx: &'a ExecutionCtx) -> Result<(String, String, String)> { - use super::FunctionPart::*; - use super::PeerPart::*; - - let (peer_pk, service_id, func_name) = match (&raw_call.0, &raw_call.1) { - (PeerPkWithServiceId(peer_pk, peer_service_id), ServiceIdWithFuncName(_service_id, func_name)) => { - Ok((peer_pk, peer_service_id, func_name)) - } - (PeerPkWithServiceId(peer_pk, peer_service_id), FuncName(func_name)) => { - Ok((peer_pk, peer_service_id, func_name)) - } - (PeerPk(peer_pk), ServiceIdWithFuncName(service_id, func_name)) => Ok((peer_pk, service_id, func_name)), - (PeerPk(_), FuncName(_)) => Err(AquamarineError::InstructionError(String::from( - "call should have service id specified by peer part or function part", - ))), - }?; - - let peer_pk = if peer_pk != CURRENT_PEER_ALIAS { - prepare_call_arg(peer_pk, exec_ctx)? - } else { - peer_pk.to_string() - }; - - let service_id = prepare_call_arg(service_id, exec_ctx)?; - let func_name = prepare_call_arg(func_name, exec_ctx)?; - - Ok((peer_pk, service_id, func_name)) -} - -fn extract_args_by_paths(function_arg_paths: &[String], ctx: &ExecutionCtx) -> Result { - let mut result = Vec::with_capacity(function_arg_paths.len()); - let owned_maybe_json_path = |jvalue: Cow<'_, JValue>, json_path: Option<&str>| -> Result> { - if json_path.is_none() { - return Ok(vec![jvalue.into_owned()]); - } - - let json_path = json_path.unwrap(); - let values = find_by_json_path(jvalue.as_ref(), json_path)?; - Ok(values.into_iter().cloned().collect()) - }; - - for arg_path in function_arg_paths.iter() { - if is_string_literal(arg_path) { - result.push(JValue::String(arg_path[1..arg_path.len() - 1].to_string())); - } else { - let arg = get_args_by_path(arg_path, ctx, owned_maybe_json_path)?; - result.extend(arg); - } - } - - Ok(JValue::Array(result)) -} - -fn parse_result_variable_name(call: &Call) -> Result<&str> { - let result_variable_name = &call.3; - - if result_variable_name.is_empty() { - return Err(AquamarineError::InstructionError(String::from( - "result name of a call instruction must be non empty", - ))); - } - - if is_string_literal(result_variable_name) { - return Err(AquamarineError::InstructionError(String::from( - "result name of a call instruction must be non string literal", - ))); - } - - Ok(result_variable_name) -} - -fn get_args_by_path<'args_path, 'exec_ctx, T: 'exec_ctx>( - args_path: &'args_path str, - ctx: &'exec_ctx ExecutionCtx, - maybe_json_path: impl FnOnce(Cow<'exec_ctx, JValue>, Option<&str>) -> Result, -) -> Result { - let mut split_arg: Vec<&str> = args_path.splitn(2, '.').collect(); - let arg_path_head = split_arg.remove(0); - - match ctx.data_cache.get(arg_path_head) { - Some(AValue::JValueFoldCursor(fold_state)) => match fold_state.iterable.as_ref() { - JValue::Array(array) => { - let jvalue = &array[fold_state.cursor]; - maybe_json_path(Cow::Borrowed(jvalue), split_arg.pop()) - } - _ => unreachable!("fold state must be well-formed because it is changed only by stepper"), - }, - Some(AValue::JValueRef(value)) => maybe_json_path(Cow::Borrowed(value.as_ref()), split_arg.pop()), - Some(AValue::JValueAccumulatorRef(acc)) => { - let owned_acc = acc.borrow().iter().map(|v| v.as_ref()).cloned().collect::>(); - let jvalue = JValue::Array(owned_acc); - maybe_json_path(Cow::Owned(jvalue), split_arg.pop()) - } - None => Err(AquamarineError::VariableNotFound(arg_path_head.to_string())), - } -} - -// Prepare arguments of call -fn prepare_call_arg<'a>(arg_path: &'a str, ctx: &'a ExecutionCtx) -> Result { - fn borrowed_maybe_json_path(jvalue: Cow<'_, JValue>, json_path: Option<&str>) -> Result { - if json_path.is_none() { - return Ok(jvalue.into_owned()); - } - - let json_path = json_path.unwrap(); - let values = find_by_json_path(jvalue.as_ref(), json_path)?; - if values.is_empty() { - return Err(AquamarineError::VariableNotFound(json_path.to_string())); - } - - if values.len() != 1 { - return Err(AquamarineError::MultipleValuesInJsonPath(json_path.to_string())); - } - - Ok(values[0].clone()) - } - - if is_string_literal(arg_path) { - return Ok(arg_path[1..arg_path.len() - 1].to_string()); - } - - let arg = get_args_by_path(arg_path, ctx, borrowed_maybe_json_path)?; - - match arg { - JValue::String(str) => Ok(str), - v => Err(AquamarineError::IncompatibleJValueType(v, String::from("string"))), - } -} diff --git a/stepper-lib/src/air/call/triplet.rs b/stepper-lib/src/air/call/triplet.rs new file mode 100644 index 00000000..66f41ee2 --- /dev/null +++ b/stepper-lib/src/air/call/triplet.rs @@ -0,0 +1,83 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use super::utils::resolve_value; + +use crate::air::ExecutionCtx; +use crate::{AquamarineError, Result}; + +use air_parser::ast::{FunctionPart, PeerPart, Value}; + +/// Triplet represents a location of the executable code in the network +/// It is build from `PeerPart` and `FunctionPart` of a `Call` instruction +pub(super) struct Triplet<'a, 'i> { + pub(super) peer_pk: &'a Value<'i>, + pub(super) service_id: &'a Value<'i>, + pub(super) function_name: &'a Value<'i>, +} + +/// ResolvedTriplet represents same location as `Triplet`, but with all +/// variables, literals and etc resolved into final `String` +pub(super) struct ResolvedTriplet { + pub(super) peer_pk: String, + pub(super) service_id: String, + pub(super) function_name: String, +} + +impl<'a, 'i> Triplet<'a, 'i> { + /// Build a `Triplet` from `Call`'s `PeerPart` and `FunctionPart` + pub fn try_from(peer: &'a PeerPart<'i>, f: &'a FunctionPart<'i>) -> Result { + use air_parser::ast::FunctionPart::*; + use air_parser::ast::PeerPart::*; + + let (peer_pk, service_id, function_name) = match (peer, f) { + (PeerPkWithServiceId(peer_pk, peer_service_id), ServiceIdWithFuncName(_service_id, func_name)) => { + Ok((peer_pk, peer_service_id, func_name)) + } + (PeerPkWithServiceId(peer_pk, peer_service_id), FuncName(func_name)) => { + Ok((peer_pk, peer_service_id, func_name)) + } + (PeerPk(peer_pk), ServiceIdWithFuncName(service_id, func_name)) => Ok((peer_pk, service_id, func_name)), + (PeerPk(_), FuncName(_)) => Err(AquamarineError::InstructionError(String::from( + "call should have service id specified by peer part or function part", + ))), + }?; + + Ok(Self { + peer_pk, + service_id, + function_name, + }) + } + + /// Resolve variables, literals, etc in the `Triplet`, and build a `ResolvedTriplet` + pub fn resolve(self, ctx: &'a ExecutionCtx<'i>) -> Result { + let Triplet { + peer_pk, + service_id, + function_name, + } = self; + let peer_pk = resolve_value(peer_pk, ctx)?.as_ref().to_string(); + let service_id = resolve_value(service_id, ctx)?.as_ref().to_string(); + let function_name = resolve_value(function_name, ctx)?.as_ref().to_string(); + + Ok(ResolvedTriplet { + peer_pk, + service_id, + function_name, + }) + } +} diff --git a/stepper-lib/src/air/call/utils.rs b/stepper-lib/src/air/call/utils.rs index 01b14d60..39892234 100644 --- a/stepper-lib/src/air/call/utils.rs +++ b/stepper-lib/src/air/call/utils.rs @@ -24,43 +24,49 @@ use crate::AquamarineError; use crate::JValue; use crate::Result; -use std::cell::RefCell; -use std::rc::Rc; +use air_parser::ast::{CallOutput, Value}; -pub(super) fn set_local_call_result( - result_variable_name: String, - exec_ctx: &mut ExecutionCtx, +use std::{borrow::Cow, cell::RefCell, rc::Rc}; + +/// Writes result of a local `Call` instruction to `ExecutionCtx` at `output` +pub(super) fn set_local_call_result<'i>( + output: CallOutput<'i>, + exec_ctx: &mut ExecutionCtx<'i>, result: Rc, ) -> Result<()> { use std::collections::hash_map::Entry::{Occupied, Vacant}; use AquamarineError::*; - let stripped_result_name = result_variable_name.strip_suffix("[]"); - if stripped_result_name.is_none() { - // if result is not an array, simply insert it into data - match exec_ctx.data_cache.entry(result_variable_name) { - Vacant(entry) => entry.insert(AValue::JValueRef(result)), - Occupied(entry) => return Err(MultipleVariablesFound(entry.key().clone())), - }; - return Ok(()); - } - - // unwrap is safe because it's been checked for [] - match exec_ctx.data_cache.entry(stripped_result_name.unwrap().to_string()) { - Occupied(mut entry) => match entry.get_mut() { - // if result is an array, insert result to the end of the array - AValue::JValueAccumulatorRef(values) => values.borrow_mut().push(result), - v => return Err(IncompatibleAValueType(format!("{:?}", v), String::from("Array"))), - }, - Vacant(entry) => { - entry.insert(AValue::JValueAccumulatorRef(RefCell::new(vec![result]))); + match output { + CallOutput::Scalar(name) => { + match exec_ctx.data_cache.entry(name.to_string()) { + Vacant(entry) => entry.insert(AValue::JValueRef(result)), + Occupied(entry) => return Err(MultipleVariablesFound(entry.key().clone())), + }; + } + CallOutput::Accumulator(name) => { + match exec_ctx.data_cache.entry(name.to_string()) { + Occupied(mut entry) => match entry.get_mut() { + // if result is an array, insert result to the end of the array + AValue::JValueAccumulatorRef(values) => values.borrow_mut().push(result), + v => return Err(IncompatibleAValueType(format!("{:?}", v), String::from("Array"))), + }, + Vacant(entry) => { + entry.insert(AValue::JValueAccumulatorRef(RefCell::new(vec![result]))); + } + }; } } Ok(()) } -pub(super) fn set_remote_call_result(peer_pk: String, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) { +/// Writes evidence of a particle being sent to remote node +pub(super) fn set_remote_call_result<'i>( + peer_pk: String, + exec_ctx: &mut ExecutionCtx<'i>, + call_ctx: &mut CallEvidenceCtx, +) { exec_ctx.next_peer_pks.push(peer_pk); exec_ctx.subtree_complete = false; @@ -73,6 +79,7 @@ pub(super) fn set_remote_call_result(peer_pk: String, exec_ctx: &mut ExecutionCt call_ctx.new_path.push_back(new_evidence_state); } +/// Applies `json_path` to `jvalue` pub(super) fn find_by_json_path<'jvalue, 'json_path>( jvalue: &'jvalue JValue, json_path: &'json_path str, @@ -82,6 +89,86 @@ pub(super) fn find_by_json_path<'jvalue, 'json_path>( jsonpath_lib::select(jvalue, json_path).map_err(|e| JsonPathError(jvalue.clone(), String::from(json_path), e)) } -pub(super) fn is_string_literal(value: &str) -> bool { - value.starts_with('"') && value.ends_with('"') +/// Takes variable's value from `ExecutionCtx::data_cache` +/// TODO: maybe return &'i JValue? +pub(super) fn resolve_variable<'exec_ctx, 'i>(variable: &'i str, ctx: &'exec_ctx ExecutionCtx<'i>) -> Result { + use AquamarineError::VariableNotFound; + + let value = ctx + .data_cache + .get(variable) + .ok_or_else(|| VariableNotFound(variable.to_string()))?; + + match value { + AValue::JValueFoldCursor(fold_state) => { + if let JValue::Array(array) = fold_state.iterable.as_ref() { + Ok(array[fold_state.cursor].clone()) + } else { + unreachable!("fold state must be well-formed because it is changed only by stepper") + } + } + AValue::JValueRef(value) => Ok(value.as_ref().clone()), + AValue::JValueAccumulatorRef(acc) => { + let owned_acc = acc.borrow().iter().map(|v| v.as_ref()).cloned().collect::>(); + Ok(JValue::Array(owned_acc)) + } + } +} + +pub(super) fn apply_json_path<'i>(jvalue: JValue, json_path: &'i str) -> Result { + let values = find_by_json_path(&jvalue, json_path)?; + if values.is_empty() { + return Err(AquamarineError::VariableNotFound(json_path.to_string())); + } + + if values.len() != 1 { + return Err(AquamarineError::MultipleValuesInJsonPath(json_path.to_string())); + } + + // TODO: sure need this clone? + Ok(values[0].clone()) +} + +pub(super) fn require_string(value: JValue) -> Result { + if let JValue::String(s) = value { + Ok(s) + } else { + Err(AquamarineError::IncompatibleJValueType(value, "string".to_string())) + } +} + +/// Resolve value to string by either resolving variable from `ExecutionCtx`, taking literal value, or etc +pub(super) fn resolve_value<'i, 'a: 'i>(value: &'a Value<'i>, ctx: &'a ExecutionCtx<'i>) -> Result> { + let resolved = match value { + Value::CurrentPeerId => Cow::Borrowed(ctx.current_peer_id.as_str()), + Value::Literal(value) => Cow::Borrowed(*value), + Value::Variable(name) => { + let resolved = resolve_variable(name, ctx)?; + let resolved = require_string(resolved)?; + Cow::Owned(resolved) + } + Value::JsonPath { variable, path } => { + let resolved = resolve_variable(variable, ctx)?; + let resolved = apply_json_path(resolved, path)?; + let resolved = require_string(resolved)?; + Cow::Owned(resolved) + } + }; + + Ok(resolved) +} + +/// Resolve value to JValue, similar to `resolve_value` +pub(super) fn resolve_jvalue<'i>(value: &Value<'i>, ctx: &ExecutionCtx<'i>) -> Result { + let value = match value { + Value::CurrentPeerId => JValue::String(ctx.current_peer_id.clone()), + Value::Literal(value) => JValue::String(value.to_string()), + Value::Variable(name) => resolve_variable(name, ctx)?, + Value::JsonPath { variable, path } => { + let value = resolve_variable(variable, ctx)?; + apply_json_path(value, path)? + } + }; + + Ok(value) } diff --git a/stepper-lib/src/air/execution_context.rs b/stepper-lib/src/air/execution_context.rs index 36793bb6..3344e4b8 100644 --- a/stepper-lib/src/air/execution_context.rs +++ b/stepper-lib/src/air/execution_context.rs @@ -22,9 +22,9 @@ use std::fmt::Formatter; /// Execution context contains all necessary information needed to execute aqua script. #[derive(Clone, Default, Debug)] -pub(crate) struct ExecutionCtx { +pub(crate) struct ExecutionCtx<'i> { /// Contains all set variables. - pub data_cache: HashMap, + pub data_cache: HashMap>, /// Set of peer public keys that should receive resulted data. pub next_peer_pks: Vec, @@ -41,7 +41,7 @@ pub(crate) struct ExecutionCtx { pub subtree_complete: bool, } -impl ExecutionCtx { +impl<'i> ExecutionCtx<'i> { pub(crate) fn new(current_peer_id: String) -> Self { Self { data_cache: HashMap::new(), @@ -52,7 +52,7 @@ impl ExecutionCtx { } } -impl Display for ExecutionCtx { +impl<'i> Display for ExecutionCtx<'i> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { writeln!(f, "data cache:")?; for (key, value) in self.data_cache.iter() { diff --git a/stepper-lib/src/air/fold.rs b/stepper-lib/src/air/fold.rs index b176a7c4..0b2a0d61 100644 --- a/stepper-lib/src/air/fold.rs +++ b/stepper-lib/src/air/fold.rs @@ -23,8 +23,8 @@ use crate::AquamarineError; use crate::JValue; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::{Fold, Next}; + use std::rc::Rc; /* @@ -36,32 +36,22 @@ use std::rc::Rc; ) */ -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Fold(String, String, Rc); - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Next(String); - #[derive(Debug, Clone, PartialEq, Eq)] -pub(crate) struct FoldState { +pub(crate) struct FoldState<'i> { // TODO: maybe change to bidirectional iterator pub(crate) cursor: usize, pub(crate) iterable: Rc, - pub(crate) instr_head: Rc, + pub(crate) instr_head: Rc>, } -impl super::ExecutableInstruction for Fold { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Fold<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { use AquamarineError::*; log_instruction!(fold, exec_ctx, call_ctx); - let iterable_name = &self.0; - let iterator_name = &self.1; - let instr_head = self.2.clone(); - // check that value exists and has array type - let iterable = match exec_ctx.data_cache.get(iterable_name) { + let iterable = match exec_ctx.data_cache.get(self.iterable) { Some(AValue::JValueRef(jvalue_rc)) => { match jvalue_rc.as_ref() { JValue::Array(array) => { @@ -76,41 +66,41 @@ impl super::ExecutableInstruction for Fold { } } Some(v) => return Err(IncompatibleAValueType(format!("{:?}", v), String::from("JValueRef"))), - None => return Err(VariableNotFound(String::from(iterable_name))), + None => return Err(VariableNotFound(self.iterable.to_string())), }; let fold_state = FoldState { cursor: 0, iterable: iterable.clone(), - instr_head: instr_head.clone(), + instr_head: self.instruction.clone(), }; let previous_value = exec_ctx .data_cache - .insert(iterator_name.clone(), AValue::JValueFoldCursor(fold_state)); + .insert(self.iterator.to_string(), AValue::JValueFoldCursor(fold_state)); if previous_value.is_some() { - return Err(MultipleFoldStates(iterable_name.clone())); + return Err(MultipleFoldStates(self.iterable.to_string())); } - instr_head.execute(exec_ctx, call_ctx)?; - exec_ctx.data_cache.remove(iterator_name); + self.instruction.execute(exec_ctx, call_ctx)?; + exec_ctx.data_cache.remove(self.iterator); Ok(()) } } -impl super::ExecutableInstruction for Next { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Next<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { use AquamarineError::IncompatibleAValueType; log_instruction!(next, exec_ctx, call_ctx); - let iterator_name = &self.0; + let iterator_name = self.0; let avalue = exec_ctx .data_cache .get_mut(iterator_name) - .ok_or_else(|| AquamarineError::FoldStateNotFound(iterator_name.clone()))?; + .ok_or_else(|| AquamarineError::FoldStateNotFound(iterator_name.to_string()))?; let fold_state = match avalue { AValue::JValueFoldCursor(state) => state, v => { @@ -172,15 +162,15 @@ mod tests { let lfold = String::from( r#" - (seq ( - (call ("set_variable" ("" "") () Iterable)) - (fold (Iterable i - (seq ( - (call ("A" ("" "") (i) acc[])) + (seq + (call "set_variable" ("" "") [] Iterable) + (fold Iterable i + (seq + (call "A" ("" "") [i] acc[]) (next i) - )) - )) - ))"#, + ) + ) + )"#, ); let res = call_vm!(set_variable_vm, "", lfold.clone(), "[]", "[]"); @@ -205,15 +195,15 @@ mod tests { let rfold = String::from( r#" - (seq ( - (call ("set_variable" ("" "") () Iterable)) - (fold (Iterable i - (seq ( + (seq + (call "set_variable" ("" "") [] Iterable) + (fold Iterable i + (seq (next i) - (call ("A" ("" "") (i) acc[])) - )) - )) - ))"#, + (call "A" ("" "") [i] acc[]) + ) + ) + )"#, ); let res = call_vm!(set_variable_vm, "", rfold.clone(), "[]", "[]"); @@ -238,23 +228,23 @@ mod tests { let script = String::from( r#" - (seq ( - (seq ( - (call ("set_variable" ("" "") () Iterable1)) - (call ("set_variable" ("" "") () Iterable2)) - )) - (fold (Iterable1 i - (seq ( - (fold (Iterable2 j - (seq ( - (call ("A" ("" "") (i) acc[])) + (seq + (seq + (call "set_variable" ("" "") [] Iterable1) + (call "set_variable" ("" "") [] Iterable2) + ) + (fold Iterable1 i + (seq + (fold Iterable2 j + (seq + (call "A" ("" "") [i] acc[]) (next j) - )) - )) + ) + ) (next i) - )) - )) - ))"#, + ) + ) + )"#, ); let res = call_vm!(set_variable_vm, "", script.clone(), "[]", "[]"); @@ -281,23 +271,23 @@ mod tests { let script = String::from( r#" - (seq ( - (seq ( - (call ("set_variable" ("" "") () Iterable1)) - (call ("set_variable" ("" "") () Iterable2)) - )) - (fold (Iterable1 i - (seq ( - (fold (Iterable2 i - (seq ( - (call ("A" ("" "") (i) acc[])) + (seq + (seq + (call "set_variable" ("" "") [] Iterable1) + (call "set_variable" ("" "") [] Iterable2) + ) + (fold Iterable1 i + (seq + (fold Iterable2 i + (seq + (call "A" ("" "") [i] acc[]) (next i) - )) - )) + ) + ) (next i) - )) - )) - ))"#, + ) + ) + )"#, ); let res = vm.call_with_prev_data("", script, "[]", "[]"); @@ -325,15 +315,15 @@ mod tests { let empty_fold = String::from( r#" - (seq ( - (call ("set_variable" ("" "") () Iterable)) - (fold (Iterable i - (seq ( - (call ("A" ("" "") (i) acc[])) + (seq + (call "set_variable" ("" "") [] Iterable) + (fold Iterable i + (seq + (call "A" ("" "") [i] acc[]) (next i) - )) - )) - ))"#, + ) + ) + )"#, ); let res = call_vm!(set_variable_vm, "", empty_fold.clone(), "[]", "[]"); diff --git a/stepper-lib/src/air/mod.rs b/stepper-lib/src/air/mod.rs index 922864ce..abf87e7a 100644 --- a/stepper-lib/src/air/mod.rs +++ b/stepper-lib/src/air/mod.rs @@ -29,43 +29,24 @@ pub(self) use crate::call_evidence::CallEvidenceCtx; pub(self) use crate::call_evidence::EvidenceState; use crate::Result; -use call::Call; -use fold::Fold; -use fold::Next; -use null::Null; -use par::Par; -use seq::Seq; -use xor::Xor; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::Instruction; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(rename_all = "kebab-case")] -pub(crate) enum Instruction { - Null(Null), - Call(Call), - Fold(Fold), - Next(Next), - Par(Par), - Seq(Seq), - Xor(Xor), +pub(crate) trait ExecutableInstruction<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()>; } -pub(crate) trait ExecutableInstruction { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()>; -} - -impl ExecutableInstruction for Instruction { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> ExecutableInstruction<'i> for Instruction<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { match self { - Instruction::Null(null) => null.execute(exec_ctx, call_ctx), + Instruction::Seq(seq) => seq.execute(exec_ctx, call_ctx), Instruction::Call(call) => call.execute(exec_ctx, call_ctx), + Instruction::Null(null) => null.execute(exec_ctx, call_ctx), Instruction::Fold(fold) => fold.execute(exec_ctx, call_ctx), Instruction::Next(next) => next.execute(exec_ctx, call_ctx), Instruction::Par(par) => par.execute(exec_ctx, call_ctx), - Instruction::Seq(seq) => seq.execute(exec_ctx, call_ctx), Instruction::Xor(xor) => xor.execute(exec_ctx, call_ctx), + Instruction::Error => unreachable!("should not execute if parsing failed. QED."), } } } diff --git a/stepper-lib/src/air/null.rs b/stepper-lib/src/air/null.rs index 5b8c920d..2fbd2c71 100644 --- a/stepper-lib/src/air/null.rs +++ b/stepper-lib/src/air/null.rs @@ -19,14 +19,10 @@ use super::ExecutionCtx; use crate::log_instruction; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::Null; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Null {} - -impl super::ExecutableInstruction for Null { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Null { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { log_instruction!(null, exec_ctx, call_ctx); Ok(()) diff --git a/stepper-lib/src/air/par.rs b/stepper-lib/src/air/par.rs index 3d119bb8..b1ab5160 100644 --- a/stepper-lib/src/air/par.rs +++ b/stepper-lib/src/air/par.rs @@ -23,14 +23,10 @@ use crate::log_instruction; use crate::log_targets::EVIDENCE_CHANGING; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::Par; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Par(Box, Box); - -impl ExecutableInstruction for Par { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> ExecutableInstruction<'i> for Par<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { log_instruction!(par, exec_ctx, call_ctx); let (left_subtree_size, right_subtree_size) = extract_subtree_sizes(call_ctx)?; @@ -87,10 +83,10 @@ fn extract_subtree_sizes(call_ctx: &mut CallEvidenceCtx) -> Result<(usize, usize } } -fn execute_subtree( - subtree: &Instruction, +fn execute_subtree<'i>( + subtree: &Instruction<'i>, subtree_size: usize, - exec_ctx: &mut ExecutionCtx, + exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx, ) -> Result { call_ctx.current_subtree_elements_count = subtree_size; @@ -104,14 +100,14 @@ fn execute_subtree( Ok(call_ctx.new_path.len() - before_states_count) } -fn determine_subtree_complete(next_instruction: &Instruction) -> bool { +fn determine_subtree_complete(next_instruction: &Instruction<'_>) -> bool { // this is needed to prevent situation when on such pattern // (fold (Iterable i - // (par ( - // (call (..)) + // (par + // (call ..) // (next i) - // )) - // )) + // ) + // ) // par will be executed after the last next that wouldn't change subtree_complete !matches!(next_instruction, Instruction::Next(_)) } @@ -130,10 +126,10 @@ mod tests { let script = String::from( r#" - (par ( - (call ("remote_peer_id_1" ("local_service_id" "local_fn_name") () result_name)) - (call ("remote_peer_id_2" ("service_id" "fn_name") () g)) - ))"#, + (par + (call "remote_peer_id_1" ("local_service_id" "local_fn_name") [] result_name) + (call "remote_peer_id_2" ("service_id" "fn_name") [] g) + )"#, ); let mut res = call_vm!(vm, "", script, "[]", "[]"); @@ -151,10 +147,10 @@ mod tests { let script = String::from( r#" - (par ( - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_name)) - (call ("remote_peer_id_2" ("service_id" "fn_name") () g)) - ))"#, + (par + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_name) + (call "remote_peer_id_2" ("service_id" "fn_name") [] g) + )"#, ); let res = call_vm!(vm, "", script, "[]", "[]"); diff --git a/stepper-lib/src/air/seq.rs b/stepper-lib/src/air/seq.rs index da8ad845..c5f70eaf 100644 --- a/stepper-lib/src/air/seq.rs +++ b/stepper-lib/src/air/seq.rs @@ -16,18 +16,13 @@ use super::CallEvidenceCtx; use super::ExecutionCtx; -use super::Instruction; use crate::log_instruction; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::Seq; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Seq(Box, Box); - -impl super::ExecutableInstruction for Seq { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Seq<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { log_instruction!(seq, exec_ctx, call_ctx); exec_ctx.subtree_complete = true; @@ -55,10 +50,10 @@ mod tests { let script = String::from( r#" - (seq ( - (call ("remote_peer_id_1" ("local_service_id" "local_fn_name") () result_name)) - (call ("remote_peer_id_2" ("service_id" "fn_name") () g)) - ))"#, + (seq + (call "remote_peer_id_1" ("local_service_id" "local_fn_name") [] result_name) + (call "remote_peer_id_2" ("service_id" "fn_name") [] g) + )"#, ); let res = call_vm!(vm, "asd", script.clone(), "[]", "[]"); @@ -74,10 +69,10 @@ mod tests { let script = String::from( r#" - (seq ( - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_name)) - (call ("remote_peer_id_2" ("service_id" "fn_name") () g)) - ))"#, + (seq + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_name) + (call "remote_peer_id_2" ("service_id" "fn_name") [] g) + )"#, ); let res = call_vm!(vm, "asd", script, "[]", "[]"); diff --git a/stepper-lib/src/air/xor.rs b/stepper-lib/src/air/xor.rs index 4cbc0efd..311ca017 100644 --- a/stepper-lib/src/air/xor.rs +++ b/stepper-lib/src/air/xor.rs @@ -16,19 +16,14 @@ use super::CallEvidenceCtx; use super::ExecutionCtx; -use super::Instruction; use crate::log_instruction; use crate::AquamarineError::LocalServiceError; use crate::Result; -use serde_derive::Deserialize; -use serde_derive::Serialize; +use air_parser::ast::Xor; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Xor(Box, Box); - -impl super::ExecutableInstruction for Xor { - fn execute(&self, exec_ctx: &mut ExecutionCtx, call_ctx: &mut CallEvidenceCtx) -> Result<()> { +impl<'i> super::ExecutableInstruction<'i> for Xor<'i> { + fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, call_ctx: &mut CallEvidenceCtx) -> Result<()> { log_instruction!(xor, exec_ctx, call_ctx); exec_ctx.subtree_complete = true; @@ -83,10 +78,10 @@ mod tests { let script = String::from( r#" - (xor ( - (call (%current_peer_id% ("service_id_1" "local_fn_name") () result_1)) - (call (%current_peer_id% ("service_id_2" "local_fn_name") () result_2)) - ))"#, + (xor + (call %current_peer_id% ("service_id_1" "local_fn_name") [] result_1) + (call %current_peer_id% ("service_id_2" "local_fn_name") [] result_2) + )"#, ); let res = call_vm!(vm, "asd", script, "[]", "[]"); @@ -101,10 +96,10 @@ mod tests { let script = String::from( r#" - (xor ( - (call (%current_peer_id% ("service_id_2" "local_fn_name") () result_1)) - (call (%current_peer_id% ("service_id_1" "local_fn_name") () result_2)) - ))"#, + (xor + (call %current_peer_id% ("service_id_2" "local_fn_name") [] result_1) + (call %current_peer_id% ("service_id_1" "local_fn_name") [] result_2) + )"#, ); let res = call_vm!(vm, "asd", script, "[]", "[]"); diff --git a/stepper-lib/src/errors.rs b/stepper-lib/src/errors.rs index 2c10cd63..dd4bab09 100644 --- a/stepper-lib/src/errors.rs +++ b/stepper-lib/src/errors.rs @@ -22,7 +22,6 @@ use crate::StepperOutcome; use jsonpath_lib::JsonPathError; use serde_json::Error as SerdeJsonError; -use serde_sexpr::Error as SExprError; use std::convert::Into; use std::env::VarError; @@ -30,8 +29,8 @@ use std::error::Error; #[derive(Debug)] pub enum AquamarineError { - /// Errors occurred while parsing aqua script in the form of S expressions. - SExprParseError(SExprError), + /// Error occurred while parsing AIR script + AIRParseError(String), /// Errors occurred while parsing function arguments of an expression. FuncArgsSerializationError(JValue, SerdeJsonError), @@ -76,7 +75,7 @@ pub enum AquamarineError { InvalidEvidenceState(EvidenceState, String), /// Errors occurred on call evidence deserialization. - CallEvidenceDeserializationError(SerdeJsonError), + CallEvidenceDeserializationError(SerdeJsonError, String), /// Errors occurred on call evidence serialization. CallEvidenceSerializationError(SerdeJsonError), @@ -96,7 +95,7 @@ impl Error for AquamarineError {} impl std::fmt::Display for AquamarineError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { match self { - AquamarineError::SExprParseError(err) => write!(f, "aqua script can't be parsed: {:?}", err), + AquamarineError::AIRParseError(err) => write!(f, "aqua script can't be parsed:\n{}", err), AquamarineError::FuncArgsSerializationError(args, err) => write!( f, "function arguments {} can't be serialized or deserialized with an error: {:?}", @@ -145,9 +144,11 @@ impl std::fmt::Display for AquamarineError { "invalid evidence state: expected {}, but found {:?}", expected, found ), - AquamarineError::CallEvidenceDeserializationError(err) => { - write!(f, "an error occurred while data deserialization: {:?}", err) - } + AquamarineError::CallEvidenceDeserializationError(err, path) => write!( + f, + "an error occurred while call evidence path deserialization on {:?}: {:?}", + path, err + ), AquamarineError::CallEvidenceSerializationError(err) => { write!(f, "an error occurred while data serialization: {:?}", err) } @@ -170,12 +171,6 @@ impl std::fmt::Display for AquamarineError { } } -impl From for AquamarineError { - fn from(err: SExprError) -> Self { - AquamarineError::SExprParseError(err) - } -} - impl From for AquamarineError { fn from(_: std::convert::Infallible) -> Self { unreachable!() @@ -185,7 +180,7 @@ impl From for AquamarineError { impl Into for AquamarineError { fn into(self) -> StepperOutcome { let ret_code = match self { - AquamarineError::SExprParseError(_) => 1, + AquamarineError::AIRParseError(_) => 1, AquamarineError::FuncArgsSerializationError(..) => 2, AquamarineError::CallServiceResultDeserializationError(..) => 3, AquamarineError::CurrentPeerIdEnvError(..) => 4, diff --git a/stepper-lib/src/execution.rs b/stepper-lib/src/execution.rs index c275e01c..1f0496fd 100644 --- a/stepper-lib/src/execution.rs +++ b/stepper-lib/src/execution.rs @@ -38,7 +38,7 @@ pub fn execute_aqua(init_user_id: String, aqua: String, prev_data: String, data: } fn execute_aqua_impl(_init_user_id: String, aqua: String, prev_path: String, path: String) -> Result { - let (prev_path, path, aqua) = prepare(prev_path, path, aqua)?; + let (prev_path, path, aqua) = prepare(prev_path, path, aqua.as_str())?; let (mut exec_ctx, mut call_ctx) = make_contexts(prev_path, path)?; aqua.execute(&mut exec_ctx, &mut call_ctx)?; diff --git a/stepper-lib/src/execution/prolog.rs b/stepper-lib/src/execution/prolog.rs index 6af2935d..fd26a7d6 100644 --- a/stepper-lib/src/execution/prolog.rs +++ b/stepper-lib/src/execution/prolog.rs @@ -14,9 +14,7 @@ * limitations under the License. */ -use super::utils::format_aqua; use crate::air::ExecutionCtx; -use crate::air::Instruction; use crate::call_evidence::merge_call_paths; use crate::call_evidence::CallEvidenceCtx; use crate::get_current_peer_id; @@ -25,19 +23,21 @@ use crate::AquamarineError; use crate::CallEvidencePath; use crate::Result; +use air_parser::ast::Instruction; + /// Parse and prepare supplied data and aqua script. -pub(super) fn prepare( +pub(super) fn prepare<'i>( raw_prev_path: String, raw_path: String, - raw_aqua: String, -) -> Result<(CallEvidencePath, CallEvidencePath, Instruction)> { + raw_aqua: &'i str, +) -> Result<(CallEvidencePath, CallEvidencePath, Instruction<'i>)> { use AquamarineError::CallEvidenceDeserializationError as CallDeError; - let prev_path: CallEvidencePath = serde_json::from_str(&raw_prev_path).map_err(CallDeError)?; - let path: CallEvidencePath = serde_json::from_str(&raw_path).map_err(CallDeError)?; + let prev_path: CallEvidencePath = + serde_json::from_str(&raw_prev_path).map_err(|err| CallDeError(err, raw_prev_path))?; + let path: CallEvidencePath = serde_json::from_str(&raw_path).map_err(|err| CallDeError(err, raw_path))?; - let formatted_aqua = format_aqua(raw_aqua); - let aqua: Instruction = serde_sexpr::from_str(&formatted_aqua)?; + let aqua: Instruction<'i> = *air_parser::parse(raw_aqua).map_err(|msg| AquamarineError::AIRParseError(msg))?; log::info!( target: RUN_PARAMS, @@ -55,7 +55,7 @@ pub(super) fn prepare( pub(super) fn make_contexts( prev_path: CallEvidencePath, path: CallEvidencePath, -) -> Result<(ExecutionCtx, CallEvidenceCtx)> { +) -> Result<(ExecutionCtx<'static>, CallEvidenceCtx)> { use AquamarineError::CurrentPeerIdEnvError as EnvError; let current_peer_id = get_current_peer_id().map_err(|e| EnvError(e, String::from("CURRENT_PEER_ID")))?; diff --git a/stepper-lib/src/execution/utils.rs b/stepper-lib/src/execution/utils.rs index 042833b5..cb0ef5f6 100644 --- a/stepper-lib/src/execution/utils.rs +++ b/stepper-lib/src/execution/utils.rs @@ -16,36 +16,6 @@ use std::hash::Hash; -/// Formats aqua script in a form of S-expressions to a form compatible with the serde_sexpr crate. -pub(super) fn format_aqua(aqua: String) -> String { - use std::iter::FromIterator; - - let mut formatted_aqua = Vec::with_capacity(aqua.len()); - // whether to skip the next whitespace - let mut skip_next_whitespace = false; - // whether c was a closing brace - let mut was_cbr = false; - - for c in aqua.chars() { - let is_whitespace = c == ' '; - if (skip_next_whitespace && is_whitespace) || c == '\n' { - continue; - } - - let is_cbr = c == ')'; - - skip_next_whitespace = is_whitespace || c == '(' || is_cbr; - if was_cbr && !is_cbr { - formatted_aqua.push(' '); - } - - was_cbr = is_cbr; - formatted_aqua.push(c) - } - - String::from_iter(formatted_aqua.into_iter()) -} - /// Deduplicate values in a supplied vector. pub(super) fn dedup(mut vec: Vec) -> Vec { use std::collections::HashSet; @@ -53,28 +23,3 @@ pub(super) fn dedup(mut vec: Vec) -> Vec { let set: HashSet<_> = vec.drain(..).collect(); set.into_iter().collect() } - -#[cfg(test)] -mod tests { - #[test] - fn format_aqua_test() { - let aqua = format!( - r#"(( (( (seq ( - (call (%current_peer_id% (add_module ||) (module) module)) - (seq ( - (call (%current_peer_id% (add_blueprint ||) (blueprint) blueprint_id)) - (seq ( - (call (%current_peer_id% (create ||) (blueprint_id) service_id)) - (call ({} (|| ||) (service_id) client_result)) - ) ) - ) ) - ))"#, - "abc" - ); - - let aqua = super::format_aqua(aqua); - let formatted_aqua = String::from("(((((seq ((call (%current_peer_id% (add_module ||) (module) module)) (seq ((call (%current_peer_id% (add_blueprint ||) (blueprint) blueprint_id)) (seq ((call (%current_peer_id% (create ||) (blueprint_id) service_id)) (call (abc (|| ||) (service_id) client_result))))))))"); - - assert_eq!(aqua, formatted_aqua); - } -} diff --git a/stepper-lib/src/lib.rs b/stepper-lib/src/lib.rs index 451c6f05..1888a1c8 100644 --- a/stepper-lib/src/lib.rs +++ b/stepper-lib/src/lib.rs @@ -54,13 +54,13 @@ use std::fmt::Formatter; use std::rc::Rc; #[derive(Debug, Clone, Eq, PartialEq)] -pub(crate) enum AValue { +pub(crate) enum AValue<'i> { JValueRef(Rc), JValueAccumulatorRef(RefCell>>), - JValueFoldCursor(crate::air::FoldState), + JValueFoldCursor(crate::air::FoldState<'i>), } -impl Display for AValue { +impl<'i> Display for AValue<'i> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { AValue::JValueRef(value) => write!(f, "{:?}", value)?, diff --git a/stepper-lib/tests/air_basic.rs b/stepper-lib/tests/air_basic.rs index 68fcc948..7ccb350d 100644 --- a/stepper-lib/tests/air_basic.rs +++ b/stepper-lib/tests/air_basic.rs @@ -38,13 +38,13 @@ fn seq_par_call() { let script = String::from( r#" - (seq ( - (par ( - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_1)) - (call ("remote_peer_id" ("service_id" "fn_name") () g)) - )) - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_2)) - ))"#, + (seq + (par + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_1) + (call "remote_peer_id" ("service_id" "fn_name") [] g) + ) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let res = call_vm!(vm, "asd", script, "[]", "[]"); @@ -72,13 +72,13 @@ fn par_par_call() { let script = String::from( r#" - (par ( - (par ( - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_1)) - (call ("remote_peer_id" ("service_id" "fn_name") () g)) - )) - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_2)) - ))"#, + (par + (par + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_1) + (call "remote_peer_id" ("service_id" "fn_name") [] g) + ) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let res = call_vm!(vm, "asd", script, "[]", "[]"); @@ -153,25 +153,25 @@ fn create_service() { let script = String::from( r#" - (seq ( - (seq ( - (seq ( - (call ("set_variables" ("" "") ("module_bytes") module_bytes)) - (call ("set_variables" ("" "") ("module_config") module_config)) - )) - (call ("set_variables" ("" "") ("blueprint") blueprint)) - )) - (seq ( - (call ("A" ("add_module" "") (module_bytes module_config) module)) - (seq ( - (call ("A" ("add_blueprint" "") (blueprint) blueprint_id)) - (seq ( - (call ("A" ("create" "") (blueprint_id) service_id)) - (call ("remote_peer_id" ("" "") (service_id) client_result)) - )) - )) - )) - ))"#, + (seq + (seq + (seq + (call "set_variables" ("" "") ["module_bytes"] module_bytes) + (call "set_variables" ("" "") ["module_config"] module_config) + ) + (call "set_variables" ("" "") ["blueprint"] blueprint) + ) + (seq + (call "A" ("add_module" "") [module_bytes module_config] module) + (seq + (call "A" ("add_blueprint" "") [blueprint] blueprint_id) + (seq + (call "A" ("create" "") [blueprint_id] service_id) + (call "remote_peer_id" ("" "") [service_id] client_result) + ) + ) + ) + )"#, ); let res = call_vm!(set_variables_vm, "init_user_id", script.clone(), "[]", "[]"); diff --git a/stepper-lib/tests/call_evidence_basic.rs b/stepper-lib/tests/call_evidence_basic.rs index 1c30fa11..fd4e938e 100644 --- a/stepper-lib/tests/call_evidence_basic.rs +++ b/stepper-lib/tests/call_evidence_basic.rs @@ -37,13 +37,13 @@ fn evidence_seq_par_call() { let script = String::from( r#" - (seq ( - (par ( - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_1)) - (call ("remote_peer_id" ("service_id" "fn_name") () g)) - )) - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_2)) - ))"#, + (seq + (par + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_1) + (call "remote_peer_id" ("service_id" "fn_name") [] g) + ) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let initial_state = json!([ @@ -77,13 +77,13 @@ fn evidence_par_par_call() { let script = String::from( r#" - (par ( - (par ( - (call ("some_peer_id" ("local_service_id" "local_fn_name") () result_1)) - (call ("remote_peer_id" ("service_id" "fn_name") () g)) - )) - (call (%current_peer_id% ("local_service_id" "local_fn_name") () result_2)) - ))"#, + (par + (par + (call "some_peer_id" ("local_service_id" "local_fn_name") [] result_1) + (call "remote_peer_id" ("service_id" "fn_name") [] g) + ) + (call %current_peer_id% ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let initial_state = json!([ @@ -122,13 +122,13 @@ fn evidence_seq_seq() { let script = format!( r#" - (seq ( - (call ("{}" ("identity" "") () void0)) - (seq ( - (call ("{}" ("add_blueprint" "") () blueprint_id)) - (call ("{}" ("addBlueprint-14d8488e-d10d-474d-96b2-878f6a7d74c8" "") () void1)) - )) - )) + (seq + (call "{}" ("identity" "") [] void0) + (seq + (call "{}" ("add_blueprint" "") [] blueprint_id) + (call "{}" ("addBlueprint-14d8488e-d10d-474d-96b2-878f6a7d74c8" "") [] void1) + ) + ) "#, peer_id_1, peer_id_1, peer_id_2 ); @@ -201,25 +201,25 @@ fn evidence_create_service() { let script = String::from( r#" - (seq ( - (seq ( - (seq ( - (call ("set_variables" ("add_module" "") ("module_bytes") module_bytes)) - (call ("set_variables" ("add_module" "") ("module_config") module_config)) - )) - (call ("set_variables" ("add_module" "") ("blueprint") blueprint)) - )) - (seq ( - (call ("A" ("add_module" "") (module_bytes module_config) module)) - (seq ( - (call ("A" ("add_blueprint" "") (blueprint) blueprint_id)) - (seq ( - (call ("A" ("create" "") (blueprint_id) service_id)) - (call ("remote_peer_id" ("" "") (service_id) client_result)) - )) - )) - )) - ))"#, + (seq + (seq + (seq + (call "set_variables" ("add_module" "") ["module_bytes"] module_bytes) + (call "set_variables" ("add_module" "") ["module_config"] module_config) + ) + (call "set_variables" ("add_module" "") ["blueprint"] blueprint) + ) + (seq + (call "A" ("add_module" "") [module_bytes module_config] module) + (seq + (call "A" ("add_blueprint" "") [blueprint] blueprint_id) + (seq + (call "A" ("create" "") [blueprint_id] service_id) + (call "remote_peer_id" ("" "") [service_id] client_result) + ) + ) + ) + )"#, ); let add_module_response = String::from("add_module response"); @@ -263,18 +263,18 @@ fn evidence_par_seq_fold_call() { let script = String::from( r#" - (par ( - (seq ( - (call ("some_peer_id_1" ("local_service_id" "local_fn_name") () IterableResultPeer1)) - (fold (IterableResultPeer1 i - (par ( - (call ("some_peer_id_2" ("local_service_id" "local_fn_name") (i) acc[])) + (par + (seq + (call "some_peer_id_1" ("local_service_id" "local_fn_name") [] IterableResultPeer1) + (fold IterableResultPeer1 i + (par + (call "some_peer_id_2" ("local_service_id" "local_fn_name") [i] acc[]) (next i) - )) - )) - )) - (call ("some_peer_id_3" ("local_service_id" "local_fn_name") () result_2)) - ))"#, + ) + ) + ) + (call "some_peer_id_3" ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let res = call_vm!(vm2, "asd", script.clone(), "[]", "[]"); @@ -339,18 +339,18 @@ fn evidence_par_seq_fold_in_cycle_call() { let script = String::from( r#" - (par ( - (seq ( - (call ("some_peer_id_1" ("local_service_id" "local_fn_name") () IterableResultPeer1)) - (fold (IterableResultPeer1 i - (par ( - (call ("some_peer_id_2" ("local_service_id" "local_fn_name") (i) acc[])) + (par + (seq + (call "some_peer_id_1" ("local_service_id" "local_fn_name") [] IterableResultPeer1) + (fold IterableResultPeer1 i + (par + (call "some_peer_id_2" ("local_service_id" "local_fn_name") [i] acc[]) (next i) - )) - )) - )) - (call ("some_peer_id_3" ("local_service_id" "local_fn_name") () result_2)) - ))"#, + ) + ) + ) + (call "some_peer_id_3" ("local_service_id" "local_fn_name") [] result_2) + )"#, ); let mut data = String::from("[]"); @@ -401,19 +401,19 @@ fn evidence_seq_par_seq_seq() { let mut vm2 = create_aqua_vm(unit_call_service(), peer_id_2.clone()); let script = format!( r#" - (seq ( - (par ( - (seq ( - (call ("{}" ("" "") () result_1)) - (call ("{}" ("" "") () result_2)) - )) - (seq ( - (call ("{}" ("" "") () result_3)) - (call ("{}" ("" "") () result_4)) - )) - )) - (call ("{}" ("" "") () result_5)) - )) + (seq + (par + (seq + (call "{}" ("" "") [] result_1) + (call "{}" ("" "") [] result_2) + ) + (seq + (call "{}" ("" "") [] result_3) + (call "{}" ("" "") [] result_4) + ) + ) + (call "{}" ("" "") [] result_5) + ) "#, peer_id_1, peer_id_2, peer_id_2, peer_id_1, peer_id_2 ); diff --git a/stepper-lib/tests/data_merge.rs b/stepper-lib/tests/data_merge.rs index ac9590b5..1d1039e8 100644 --- a/stepper-lib/tests/data_merge.rs +++ b/stepper-lib/tests/data_merge.rs @@ -45,29 +45,29 @@ fn data_merge() { let script = String::from( r#" - (seq ( - (call (%current_peer_id% ("neighborhood" "") () neighborhood)) - (seq ( - (seq ( - (fold (neighborhood i - (par ( - (call (i ("add_provider" "") () void[])) + (seq + (call %current_peer_id% ("neighborhood" "") [] neighborhood) + (seq + (seq + (fold neighborhood i + (par + (call i ("add_provider" "") [] void[]) (next i) - )) - )) - (fold (neighborhood i - (par ( - (call (i ("get_providers" "") () providers[])) + ) + ) + (fold neighborhood i + (par + (call i ("get_providers" "") [] providers[]) (next i) - )) - )) - )) - (seq ( - (call ("A" ("identity" "") () void[])) - (call ("B" ("" "") () none)) - )) - )) - )) + ) + ) + ) + (seq + (call "A" ("identity" "") [] void[]) + (call "B" ("" "") [] none) + ) + ) + ) "#, ); @@ -187,22 +187,22 @@ fn acc_merge() { let script = String::from( r#" - (seq ( - (call ("A" ("add_provider" "") () void[])) - (seq ( - (call ("A" ("add_provider" "") () void[])) - (seq ( - (call ("A" ("get_providers" "") () providers[])) - (seq ( - (call ("A" ("get_providers" "") () providers[])) - (seq ( - (call ("B" ("" "2") (providers) void[])) - (call ("B" ("" "3") (void) void[])) - )) - )) - )) - )) - )) + (seq + (call "A" ("add_provider" "") [] void[]) + (seq + (call "A" ("add_provider" "") [] void[]) + (seq + (call "A" ("get_providers" "") [] providers[]) + (seq + (call "A" ("get_providers" "") [] providers[]) + (seq + (call "B" ("" "2") [providers] void[]) + (call "B" ("" "3") [void] void[]) + ) + ) + ) + ) + ) "#, ); diff --git a/stepper-lib/tests/join.rs b/stepper-lib/tests/join.rs index 7cb77450..66d20d01 100644 --- a/stepper-lib/tests/join.rs +++ b/stepper-lib/tests/join.rs @@ -48,24 +48,24 @@ fn join_chat() { let script = String::from( r#" - (seq ( - (call ("Relay1" ("identity" "") () void1[])) - (seq ( - (call ("Remote" ("552196ea-b9b2-4761-98d4-8e7dba77fac4" "add") () void2[])) - (seq ( - (call ("Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") () members)) - (fold (members m - (par ( - (seq ( - (call (m.$.[1] ("identity" "") () void[])) - (call (m.$.[0] ("fgemb3" "add") () void3[])) - )) + (seq + (call "Relay1" ("identity" "") [] void1[]) + (seq + (call "Remote" ("552196ea-b9b2-4761-98d4-8e7dba77fac4" "add") [] void2[]) + (seq + (call "Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") [] members) + (fold members m + (par + (seq + (call m.$.[1] ("identity" "") [] void[]) + (call m.$.[0] ("fgemb3" "add") [] void3[]) + ) (next m) - )) - )) - )) - )) - )) + ) + ) + ) + ) + ) "#, ); @@ -202,21 +202,21 @@ fn join() { let script = String::from( r#" - (seq ( - (call ("Relay1" ("identity" "") () void1[])) - (seq ( - (call ("Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") () members)) - (fold (members m - (par ( - (seq ( - (call ("Relay1" ("identity" "") () void[])) - (call ("A" ("fgemb3" "add") (m) void3[])) - )) - (next m) - )) - )) - )) - )) + (seq + (call "Relay1" ("identity" "") [] void1[]) + (seq + (call "Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") [] members) + (fold members m + (par + (seq + (call "Relay1" ("identity" "") [] void[]) + (call "A" ("fgemb3" "add") [m] void3[]) + ) + (next m) + ) + ) + ) + ) "#, );