├── != ├── ++ ├── ++.1 ├── ++.2 ├── +.10 ├── +.2 ├── +1 ├── +1.2 ├── -- ├── --.2 ├── -1.1.txt ├── -1.2.txt ├── -1.txt ├── .editorconfig ├── .gitignore ├── 2loop.1 ├── == ├── Cargo.lock ├── Cargo.toml ├── Rue.py ├── _ ├── acker.1 ├── argw ├── asdf ├── bin2hex ├── bin2une ├── count ├── div.1 ├── echo ├── echoprint ├── eq ├── ewfib ├── fib ├── fib.1 ├── gcd ├── get ├── gt.1 ├── gte.1 ├── hex2bin ├── if ├── isfactor ├── ispalindrome ├── isprime ├── lcm ├── len ├── len.1 ├── len.2 ├── len.x ├── loop ├── loop.1 ├── lt.1 ├── lte.1 ├── mod.1 ├── mul ├── mul.1 ├── mul.2 ├── nop ├── replaceall ├── reverse ├── rmod.1 ├── rol ├── ror ├── rsub.1 ├── set ├── shl ├── shr ├── src ├── main.rs └── vm.rs ├── std ├── +.2 ├── +.3 ├── ==.2 ├── ==.3 └── neg.3 ├── sub ├── sub.1 ├── typebin └── typehex /!=: -------------------------------------------------------------------------------- 1 | ^(.*);\1$::=0 2 | .*;.*::=1 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /++: -------------------------------------------------------------------------------- 1 | 0\+\+::=1 2 | 1\+\+::=2 3 | 2\+\+::=3 4 | 3\+\+::=4 5 | 4\+\+::=5 6 | 5\+\+::=6 7 | 6\+\+::=7 8 | 7\+\+::=8 9 | 8\+\+::=9 10 | 9\+\+::=++0 11 | \+\+0::=10 -------------------------------------------------------------------------------- /++.1: -------------------------------------------------------------------------------- 1 | @@, -------------------------------------------------------------------------------- /++.2: -------------------------------------------------------------------------------- 1 | 0\+\+::=1 2 | 1\+\+::=++0 3 | \+\+0::=10 -------------------------------------------------------------------------------- /+.10: -------------------------------------------------------------------------------- 1 | import ++ 2 | import -- 3 | (\d+) 0::=\1 4 | (\d+) (\d+)::=\1++ \2-- 5 | ::= 6 | @@ -------------------------------------------------------------------------------- /+.2: -------------------------------------------------------------------------------- 1 | (.*);(.*)::=:len.2{:bin2une{\1}:bin2une{\2}} 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /+1: -------------------------------------------------------------------------------- 1 | import ++ 2 | ::= 3 | @@++ -------------------------------------------------------------------------------- /+1.2: -------------------------------------------------------------------------------- 1 | import ++.2 2 | ::= 3 | @@++ -------------------------------------------------------------------------------- /--: -------------------------------------------------------------------------------- 1 | 0--::=--9 2 | (\D)1--::=\1 3 | 1--::=0 4 | 2--::=1 5 | 3--::=2 6 | 4--::=3 7 | 5--::=4 8 | 6--::=5 9 | 7--::=6 10 | 8--::=7 11 | 9--::=8 -------------------------------------------------------------------------------- /--.2: -------------------------------------------------------------------------------- 1 | 0--::=--1 2 | [^01]1--::=\1 3 | 1--::=0 -------------------------------------------------------------------------------- /-1.1.txt: -------------------------------------------------------------------------------- 1 | ^;,::= 2 | ::= 3 | ;@@ -------------------------------------------------------------------------------- /-1.2.txt: -------------------------------------------------------------------------------- 1 | import --.2 2 | ;([01]+)::=\1-- 3 | ::= 4 | ;@@ -------------------------------------------------------------------------------- /-1.txt: -------------------------------------------------------------------------------- 1 | import -- 2 | !(\d+)::=\1-- 3 | ::= 4 | !@@ -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.rs] 4 | charset = utf-8 5 | endof_line = lf 6 | indent_style = tab 7 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /__pycache__ 2 | /target 3 | -------------------------------------------------------------------------------- /2loop.1: -------------------------------------------------------------------------------- 1 | ^(,*), (.*)::=\1 \2\2 2 | ^ ::= 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /==: -------------------------------------------------------------------------------- 1 | ^(.*);\1$::=1 2 | .*;.*::=0 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "0.7.18" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "cfg-if" 16 | version = "1.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 19 | 20 | [[package]] 21 | name = "getrandom" 22 | version = "0.2.6" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" 25 | dependencies = [ 26 | "cfg-if", 27 | "libc", 28 | "wasi", 29 | ] 30 | 31 | [[package]] 32 | name = "libc" 33 | version = "0.2.123" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "cb691a747a7ab48abc15c5b42066eaafde10dc427e3b6ee2a1cf43db04c763bd" 36 | 37 | [[package]] 38 | name = "memchr" 39 | version = "2.4.1" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 42 | 43 | [[package]] 44 | name = "ppv-lite86" 45 | version = "0.2.16" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 48 | 49 | [[package]] 50 | name = "rand" 51 | version = "0.8.5" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 54 | dependencies = [ 55 | "libc", 56 | "rand_chacha", 57 | "rand_core", 58 | ] 59 | 60 | [[package]] 61 | name = "rand_chacha" 62 | version = "0.3.1" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 65 | dependencies = [ 66 | "ppv-lite86", 67 | "rand_core", 68 | ] 69 | 70 | [[package]] 71 | name = "rand_core" 72 | version = "0.6.3" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 75 | dependencies = [ 76 | "getrandom", 77 | ] 78 | 79 | [[package]] 80 | name = "regex" 81 | version = "1.5.5" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" 84 | dependencies = [ 85 | "aho-corasick", 86 | "memchr", 87 | "regex-syntax", 88 | ] 89 | 90 | [[package]] 91 | name = "regex-syntax" 92 | version = "0.6.25" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 95 | 96 | [[package]] 97 | name = "rue" 98 | version = "0.1.0" 99 | dependencies = [ 100 | "rand", 101 | "regex", 102 | ] 103 | 104 | [[package]] 105 | name = "wasi" 106 | version = "0.10.2+wasi-snapshot-preview1" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 109 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rue" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | regex = "1" 8 | rand = "0.8" 9 | -------------------------------------------------------------------------------- /Rue.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | from re import compile as re 3 | k=re(r"^::=.+",8).sub 4 | G={} 5 | def Rue(f,A="",s=0): 6 | from random import choice 7 | if f in G:f=G[f] 8 | else: 9 | c=f 10 | f=k("",open(f).read()) 11 | if f.startswith("import "): 12 | a=f.find("\n",8) 13 | f=open(f[7:a]).read()+f[a:] 14 | a=f.find("\nimport ")+1 15 | while a: 16 | b=f.find("\n",a+8) 17 | f=f[:a]+open(f[a+7:b]).read()+f[b:] 18 | a=f.find("\nimport ",a)+1 19 | f=f.split("\n::=\n") 20 | G[c]=f 21 | c="" 22 | R=[] 23 | for lf,C in zip(range(len(f)-1,-1,-1),f): 24 | R+=((re(R[0],16).sub,R[1] if len(R) == 2 else R[1:] or "",len(R) == 1) for R in (R.split("::=") for R in c.split("\n") if R)) 25 | while 1: 26 | while 1: 27 | c=C=C.replace("@@",A) 28 | for p0,p1,p2 in R: 29 | C=p0(choice(p1) if p2 else p1,C,1) 30 | if c is not C:break 31 | else:break 32 | if D:print(" "*s+C) 33 | if lf:break 34 | a=C.find("}") 35 | if a == -1:break 36 | while 1: 37 | b=C.rfind("{",0,a) 38 | c=C.rfind(":",0,b) 39 | f=C[c+1:b] 40 | b=C[b+1:a] 41 | C=C[:c]+(Smod[f](b) if f in Smod else Rue(f,b,s+1))+C[a+1:] 42 | a=C.find("}",c) 43 | if a == -1:break 44 | return C 45 | from sys import argv 46 | def Smod(x): 47 | print(x) 48 | return "" 49 | Smod={"print":Smod,"input":input,"argv":{str(a):b for a,b in enumerate(argv[2:])}.__getitem__} 50 | argv="_" if len(argv) == 1 else argv[1] 51 | D=open(argv).read(9)=="::=debug\n" 52 | #""" 53 | if D:print(Rue(argv)) 54 | else:Rue(argv) 55 | """ 56 | from cProfile import run;D=0;run("Rue(argv)") 57 | """#""" 58 | -------------------------------------------------------------------------------- /_: -------------------------------------------------------------------------------- 1 | ::=::=debug 2 | ::=Generally you don't want to have an infinity pump, so this is a comment 3 | :print{:len{:fib{:len{:input{:reverse{>>srahcenin yrt}}}}}} 4 | ::=:fib{16} 5 | ::=:ewfib{16} 6 | ::=:fib.1{,,,,,,,,,,,,,,,,} -------------------------------------------------------------------------------- /acker.1: -------------------------------------------------------------------------------- 1 | (,*)::=\1, 2 | (,*), ::=:acker.1{\1 ,} 3 | (,*), (,*),::=:acker.1{\1 :acker.1{\1, \2}} 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /argw: -------------------------------------------------------------------------------- 1 | import ArgV 2 | ::= 3 | ArgV@@ -------------------------------------------------------------------------------- /asdf: -------------------------------------------------------------------------------- 1 | ?::=1::=2::=3::=4::=5::=6 2 | .*,,,,,,,,,,$::= 3 | (.)(.)(.)(.);(.{3})\4;::=\1\2\3\4;\5;: 4 | (.)(.)(.)(.);(.{2})\3(.);::=\1\2\3\4;\5;: 5 | (.)(.)(.)(.);(.{1})\2(.{2});::=\1\2\3\4;\5;: 6 | (.)(.)(.)(.);\1(.{3});::=\1\2\3\4;\5;: 7 | (.)(.)(.)(.);(.*)\1(.*)::= 8 | ::= 9 | :input{>>};???? -------------------------------------------------------------------------------- /bin2hex: -------------------------------------------------------------------------------- 1 | (?<=[01]{4})([01])::=;\2 2 | ;0000::=0 3 | ;0001::=1 4 | ;0010::=2 5 | ;0011::=3 6 | ;0100::=4 7 | ;0101::=5 8 | ;0110::=6 9 | ;0111::=7 10 | ;1000::=8 11 | ;1001::=9 12 | ;1010::=A 13 | ;1011::=B 14 | ;1100::=C 15 | ;1101::=D 16 | ;1110::=E 17 | ;1111::=F 18 | ^;([01]{3})::=0\1 19 | ^;([01]{2})::=00\1 20 | ^;([01])::=000\1 21 | ::= 22 | ;@@ -------------------------------------------------------------------------------- /bin2une: -------------------------------------------------------------------------------- 1 | 0;(,*);(,*)::=;\1;\2, 2 | 1;(,*);(,*)::=;:2loop.1{\2 ,}\1;\2, 3 | ^;(,*);,*::=\1 4 | ::= 5 | @@;; -------------------------------------------------------------------------------- /count: -------------------------------------------------------------------------------- 1 | ^(,*?);(.+?);(.*?)\2::=\1,;\2; 2 | ^(,*?);.*::=\1 3 | ::= 4 | ;@@ -------------------------------------------------------------------------------- /div.1: -------------------------------------------------------------------------------- 1 | (,+) \1(,*);::=\1 \2;, 2 | ,* ,*;::= 3 | ^;(,*) (,*)::=\2 \1; 4 | ::= 5 | ;@@ -------------------------------------------------------------------------------- /echo: -------------------------------------------------------------------------------- 1 | @@ -------------------------------------------------------------------------------- /echoprint: -------------------------------------------------------------------------------- 1 | @@:print{@@} -------------------------------------------------------------------------------- /eq: -------------------------------------------------------------------------------- 1 | (.*)\1::=1 2 | .*::=0 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /ewfib: -------------------------------------------------------------------------------- 1 | import -- 2 | !1$::=, 3 | !2$::=, 4 | !(\d+)::=:ewfib{\1--}:ewfib{\1----} 5 | ::= 6 | !@@ -------------------------------------------------------------------------------- /fib: -------------------------------------------------------------------------------- 1 | ;0::=; 2 | import -- 3 | ;1(\D|$)::=,\1 4 | ;2(\D|$)::=,\1 5 | ;(\d+)::=;\1--;\1---- 6 | ::= 7 | ;@@ -------------------------------------------------------------------------------- /fib.1: -------------------------------------------------------------------------------- 1 | ;(,+),,::=;\1,;\1 2 | ;,,?::=, 3 | ;::= 4 | !::=, 5 | ::= 6 | ;@@ -------------------------------------------------------------------------------- /gcd: -------------------------------------------------------------------------------- 1 | ^(,+)\1* \1+$::=\1 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /get: -------------------------------------------------------------------------------- 1 | ^0 (.).*::=\1 2 | ^(\d+?) .::=:-1{\1} 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /gt.1: -------------------------------------------------------------------------------- 1 | (,*), (,*),::=\1 \2 2 | ,+ ::=1 3 | ,*::=0 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /gte.1: -------------------------------------------------------------------------------- 1 | (,*) (,*)::=\1 \2 2 | ,* ::=1 3 | ,+::=0 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /hex2bin: -------------------------------------------------------------------------------- 1 | ;(.*)0::=;\1____ 2 | ;(.*)1::=;\1___- 3 | 2::=__-_ 4 | 3::=__-- 5 | 4::=_-__ 6 | 5::=_-_- 7 | 6::=_--_ 8 | 7::=_--- 9 | 8::=-___ 10 | 9::=-__- 11 | A::=-_-_ 12 | B::=-_-- 13 | C::=--__ 14 | D::=--_- 15 | E::=---_ 16 | F::=---- 17 | ;::= 18 | -::=1 19 | _::=0 20 | ::= 21 | ;@@ -------------------------------------------------------------------------------- /if: -------------------------------------------------------------------------------- 1 | 1;(.*);.*::=\1 2 | 0;.*;(.*)::=\1 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /isfactor: -------------------------------------------------------------------------------- 1 | ^\1+ (.+)$::=1 2 | .*::=0 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /ispalindrome: -------------------------------------------------------------------------------- 1 | ^;(.)(.*)\1$::=;\2 2 | ^;$::=1 3 | ^;.$::=1 4 | ;.*::=0 5 | ::= 6 | ;@@ -------------------------------------------------------------------------------- /isprime: -------------------------------------------------------------------------------- 1 | ^.?$|^(..+?)\1+?$::=0 2 | .*::=1 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /lcm: -------------------------------------------------------------------------------- 1 | ^(,+) (\1+);,*::=\2 2 | ^(,*) (,*);(,*)::=\1 \2\3;\3 3 | ^;(,*) (,*)::=\2 \1;\1 4 | ::= 5 | ;@@ -------------------------------------------------------------------------------- /len: -------------------------------------------------------------------------------- 1 | ^(.*).;(\d*?)$::=\1;:+1{\2} 2 | ^;(\d*?)$::=\1 3 | ::= 4 | @@;0 -------------------------------------------------------------------------------- /len.1: -------------------------------------------------------------------------------- 1 | [^,]::=, 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /len.2: -------------------------------------------------------------------------------- 1 | ^(.*).;(\d*?)$::=\1;:+1.2{\2} 2 | ^;(\d*?)$::=\1 3 | ::= 4 | @@;0 -------------------------------------------------------------------------------- /len.x: -------------------------------------------------------------------------------- 1 | (\d+?);(.*)::=\1{\2} 2 | ::= 3 | :len.@@ -------------------------------------------------------------------------------- /loop: -------------------------------------------------------------------------------- 1 | import -- 2 | ^.*;0;(.*)$::=\1 3 | ^(.*);(\d*?);(.*)$::=\1;\2--;\3\1 4 | ::= 5 | @@; -------------------------------------------------------------------------------- /loop.1: -------------------------------------------------------------------------------- 1 | ^(,*?), (.*);::=\1 \2;\2 2 | ^ .*;::= 3 | ::= 4 | @@; -------------------------------------------------------------------------------- /lt.1: -------------------------------------------------------------------------------- 1 | (,*), (,*),::=\1 \2 2 | ,* ::=0 3 | ,+::=1 4 | ::=0 5 | ::= 6 | @@ -------------------------------------------------------------------------------- /lte.1: -------------------------------------------------------------------------------- 1 | (,*), (,*),::=\1 \2 2 | ,*::=1 3 | ,+ ::=0 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /mod.1: -------------------------------------------------------------------------------- 1 | ;(,*) (,*)::=\2 \1 2 | (,*) \1+::= 3 | ::= 4 | ;@@ -------------------------------------------------------------------------------- /mul: -------------------------------------------------------------------------------- 1 | import -- 2 | \d+ 0::=0 3 | 0 \d+::=0 4 | (\d+) 1::=\1 5 | 1 (\d+)::=\1 6 | (\d+) (\d+)::=:add{\1 \1} \2-- 7 | ::= 8 | @@ -------------------------------------------------------------------------------- /mul.1: -------------------------------------------------------------------------------- 1 | (,*) (,*),;(,*)::=\1\3 \2;\3 2 | (,*) (,*)$::=\1 \2;\1 3 | (,*) ;,*::=\1 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /mul.2: -------------------------------------------------------------------------------- 1 | ^([01]*)1;([01]+);([01]+)$::=\1;\g<2>0;:+.2{\2;\3} 2 | ^([01]*)0;([01]+);([01]+)$::=\1;\g<2>0;\3 3 | ^;[01]*;([01]*)$::=\1 4 | ::= 5 | @@;0 -------------------------------------------------------------------------------- /nop: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serprex/Rue/1faae2c1f0c875b448e50c8e347614f5bcd51448/nop -------------------------------------------------------------------------------- /replaceall: -------------------------------------------------------------------------------- 1 | ^(.*?);(.*?);(.*)\1::=\1;\2;\3\2 2 | ^.*?;.*?;(.*)::=\1 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /reverse: -------------------------------------------------------------------------------- 1 | ;$::= 2 | ;(.*)(.)$::=\2;\1 3 | ::= 4 | ;@@ -------------------------------------------------------------------------------- /rmod.1: -------------------------------------------------------------------------------- 1 | (,*) (\1+)::= 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /rol: -------------------------------------------------------------------------------- 1 | import -- 2 | ^0 ::= 3 | ^(\d+) (.)(.*)::=\1-- \3\2 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /ror: -------------------------------------------------------------------------------- 1 | import -- 2 | ^0 ::= 3 | ^(\d+) (.*)(.)::=\1-- \3\2 4 | ::= 5 | @@ -------------------------------------------------------------------------------- /rsub.1: -------------------------------------------------------------------------------- 1 | (,*) \1::= 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /set: -------------------------------------------------------------------------------- 1 | ;(\d+?) (.)(.*);::=\2;:-1{\1} \3 2 | ::= 3 | ;@@ -------------------------------------------------------------------------------- /shl: -------------------------------------------------------------------------------- 1 | ^ .*?;::= 2 | ^(,*), (.*?);.(.*)::=\1 \2;\2\3 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /shr: -------------------------------------------------------------------------------- 1 | ^ .*?;::= 2 | ^(,*), (.*?);(.*).::=\1 \3;\3\2 3 | ::= 4 | @@ -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod vm; 2 | 3 | use std::{env, fs}; 4 | use std::io::Read; 5 | 6 | fn main() { 7 | if let Some(fname) = env::args().nth(1) { 8 | if let Ok(prog) = fs::read_to_string(&fname) { 9 | let mut progsplit = prog.splitn(2, "\n::=\n"); 10 | if let Some(rulesrc) = progsplit.next() { 11 | if let Some(textsrc) = progsplit.next() { 12 | let mut textsrc = textsrc.to_string(); 13 | if textsrc.contains("@@") { 14 | let mut input = String::new(); 15 | let stdin = std::io::stdin(); 16 | stdin.lock().read_to_string(&mut input).expect("failed to read stdin"); 17 | textsrc = textsrc.replace("@@", &input); 18 | } 19 | if let Ok(rules) = vm::Rules::parse(rulesrc) { 20 | println!("{}", rules.run(&textsrc)); 21 | } 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/vm.rs: -------------------------------------------------------------------------------- 1 | use std::borrow::Cow; 2 | use rand::thread_rng; 3 | use rand::seq::SliceRandom; 4 | use regex::{Regex, RegexSet}; 5 | 6 | struct Rule { 7 | pattern: Regex, 8 | replace: String, 9 | } 10 | 11 | pub struct Rules(RegexSet, Vec); 12 | 13 | impl Rules { 14 | pub fn parse(s: &str) -> Result { 15 | let mut rules = Vec::new(); 16 | let mut prevpattern: Option = None; 17 | for line in s.lines() { 18 | if let Some(pattern) = prevpattern.take() { 19 | rules.push( 20 | Rule { 21 | pattern: pattern, 22 | replace: line.to_string(), 23 | } 24 | ) 25 | } else if line.starts_with('=') { 26 | prevpattern = Some(Regex::new(&line[1..])?); 27 | } else { 28 | let mut linesplit = line.splitn(2, "::="); 29 | if let Some(patternstr) = linesplit.next() { 30 | if patternstr.is_empty() { 31 | continue 32 | } 33 | if let Some(replacestr) = linesplit.next() { 34 | rules.push( 35 | Rule { 36 | pattern: Regex::new(patternstr)?, 37 | replace: replacestr.to_string(), 38 | } 39 | ); 40 | } 41 | } 42 | } 43 | } 44 | let set = RegexSet::new(rules.iter().map(|rule| rule.pattern.as_str()))?; 45 | Ok(Rules(set, rules)) 46 | } 47 | 48 | pub fn replace(&self, text: &mut String) -> bool { 49 | let matches = self.0.matches(&text); 50 | if let Some(&idx) = matches.iter().collect::>().choose(&mut thread_rng()) { 51 | let rule = &self.1[idx]; 52 | if let Cow::Owned(replacement) = rule.pattern.replace_all(&text, &rule.replace) { 53 | *text = replacement; 54 | true 55 | } else { 56 | false 57 | } 58 | } else { 59 | false 60 | } 61 | } 62 | 63 | pub fn run(&self, text: &str) -> String { 64 | let mut text = text.to_string(); 65 | while self.replace(&mut text) { 66 | } 67 | text 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /std/+.2: -------------------------------------------------------------------------------- 1 | \s::= 2 | ^(.*)0;(.*)0;(.*)$::=$1;$2;0$3 3 | ^(.*)0;(.*)1;(.*)$::=$1;$2;1$3 4 | ^(.*)1;(.*)0;(.*)$::=$1;$2;1$3 5 | ^(.*)1;(.*)1;(.*)$::=$1;$2:0$3 6 | ^(.*)0;(.*)0:(.*)$::=$1;$2;1$3 7 | ^(.*)0;(.*)1:(.*)$::=$1;$2:0$3 8 | ^(.*)1;(.*)0:(.*)$::=$1;$2:0$3 9 | ^(.*)1;(.*)1:(.*)$::=$1;$2:1$3 10 | ^;(.*)1;(.*)$::=;$1;1$2 11 | ^(.*)1;;(.*)$::=$1;;1$2 12 | ^;(.*)0;(.*)$::=;$1;0$2 13 | ^(.*)0;;(.*)$::=$1;;0$2 14 | ^;(.*)1:(.*)$::=;$1:0$2 15 | ^(.*)1;:(.*)$::=$1;:0$2 16 | ^;(.*)0:(.*)$::=;$1;1$2 17 | ^(.*)0;:(.*)$::=$1;;1$2 18 | ^;;(.*)$::=$1 19 | ^;:(.*)$::=1$1 20 | ^0+(1[01]*)$::=$1 21 | ^00+$::=0 22 | ::= 23 | @@; 24 | -------------------------------------------------------------------------------- /std/+.3: -------------------------------------------------------------------------------- 1 | \s::= 2 | ^(.*)\+;(.*)\+;(.*)$::=$1;$2:-$3 3 | ^(.*)\+;(.*)0;(.*)$::=$1;$2;+$3 4 | ^(.*)\+;(.*)-;(.*)$::=$1;$2;0$3 5 | ^(.*)0;(.*)\+;(.*)$::=$1;$2;+$3 6 | ^(.*)0;(.*)0;(.*)$::=$1;$2;0$3 7 | ^(.*)0;(.*)-;(.*)$::=$1;$2;-$3 8 | ^(.*)-;(.*)\+;(.*)$::=$1;$2;0$3 9 | ^(.*)-;(.*)0;(.*)$::=$1;$2;-$3 10 | ^(.*)-;(.*)-;(.*)$::=$1;$2/+$3 11 | 12 | ^(.*)\+;(.*)\+:(.*)$::=$1;$2:0$3 13 | ^(.*)\+;(.*)0:(.*)$::=$1;$2:-$3 14 | ^(.*)\+;(.*)-:(.*)$::=$1;$2;+$3 15 | ^(.*)0;(.*)\+:(.*)$::=$1;$2:-$3 16 | ^(.*)0;(.*)0:(.*)$::=$1;$2;+$3 17 | ^(.*)0;(.*)-:(.*)$::=$1;$2;0$3 18 | ^(.*)-;(.*)\+:(.*)$::=$1;$2;+$3 19 | ^(.*)-;(.*)0:(.*)$::=$1;$2;0$3 20 | ^(.*)-;(.*)-:(.*)$::=$1;$2;-$3 21 | 22 | ^(.*)\+;(.*)\+/(.*)$::=$1;$2;+$3 23 | ^(.*)\+;(.*)0/(.*)$::=$1;$2;0$3 24 | ^(.*)\+;(.*)-/(.*)$::=$1;$2;-$3 25 | ^(.*)0;(.*)\+/(.*)$::=$1;$2;0$3 26 | ^(.*)0;(.*)0/(.*)$::=$1;$2;-$3 27 | ^(.*)0;(.*)-/(.*)$::=$1;$2/+$3 28 | ^(.*)-;(.*)\+/(.*)$::=$1;$2;-$3 29 | ^(.*)-;(.*)0/(.*)$::=$1;$2/+$3 30 | ^(.*)-;(.*)-/(.*)$::=$1;$2/0$3 31 | 32 | ^(.+);([/;:])(.*)$::=$1;0$2$3 33 | ^;(.+)([/;:])(.*)$::=0;$1$2$3 34 | ^;:(.*)$::=+$1 35 | ^;;(.*)$::=0$1 36 | ^;/(.*)$::=-$1 37 | ^0+([+0-]+)$::=$1 38 | ^0+$::=0 39 | ::= 40 | @@; -------------------------------------------------------------------------------- /std/==.2: -------------------------------------------------------------------------------- 1 | \s::= 2 | ^1(.*);1(.*)$::=$1;$2 3 | ^0(.*);0(.*)$::=$1;$2 4 | ^0.*;1.*$::=0 5 | ^1.*;0.*$::=0 6 | ^;.+$::=0 7 | ^.+;$::=0 8 | ^;$::=1 9 | ::= 10 | @@ -------------------------------------------------------------------------------- /std/==.3: -------------------------------------------------------------------------------- 1 | \s::= 2 | ^\+(.*);\+(.*)$::=$1;$2 3 | ^0(.*);0(.*)$::=$1;$2 4 | ^-(.*);-(.*)$::=$1;$2 5 | ^\+(.*);[^+](.*)$::=0 6 | ^0(.*);[^0](.*)$::=0 7 | ^-(.*);[^-](.*)$::=0 8 | ^;.+$::=- 9 | ^.+;$::=- 10 | ^;$::=+ 11 | ::= 12 | @@ -------------------------------------------------------------------------------- /std/neg.3: -------------------------------------------------------------------------------- 1 | ;\+::=-; 2 | ;0::=0; 3 | ;-::=+; 4 | ;$::= 5 | ::= 6 | ;@@ -------------------------------------------------------------------------------- /sub: -------------------------------------------------------------------------------- 1 | import ++ 2 | import -- 3 | (\d+) 0::=\1 4 | 0 (\d+)$::=-\1 5 | (\d+) (\d+)::=\1-- \2-- 6 | ::= 7 | @@ -------------------------------------------------------------------------------- /sub.1: -------------------------------------------------------------------------------- 1 | (,*) \1::= 2 | ::= 3 | @@ -------------------------------------------------------------------------------- /typebin: -------------------------------------------------------------------------------- 1 | bin::=[01] 2 | ::= -------------------------------------------------------------------------------- /typehex: -------------------------------------------------------------------------------- 1 | hex::=[\dA-F] 2 | ::= --------------------------------------------------------------------------------