adc_lang/
lib.rs

1//! Core parsing and primary API
2
3pub mod structs;
4
5pub mod fns;
6
7pub mod cmds;
8
9pub mod errors;
10
11pub mod conv;
12
13use std::collections::HashMap;
14use std::sync::RwLock;
15use lazy_static::lazy_static;
16
17lazy_static! {
18	pub(crate) static ref RE_CACHE: structs::RegexCache = structs::RegexCache(RwLock::new(HashMap::new()));
19}
20
21enum CmdType {
22	///monadic pure function
23	Fn1(fns::Mon),
24
25	///dyadic pure function
26	Fn2(fns::Dya),
27	
28	///triadic pure function
29	Fn3(fns::Tri),
30
31	///impure command
32	Cmd(cmds::Cmd),
33
34	///impure command with register access
35	CmdR(cmds::CmdR),
36
37	///`exec`-specific (macros, IO, OS...)
38	Special,
39
40	///begin value literal
41	Value,
42
43	///no command
44	Space,
45
46	///invalid command
47	Wrong,
48
49	///not yet assigned, TODO: remove
50	Temp
51}
52
53/// Direct mapping of ASCII to commands/functions, mostly a jump table
54/// 
55/// PHFs are for non-schizophrenics
56const CMDS: [CmdType; 128] = {
57	use CmdType::*;
58	use fns::*;
59	use cmds::*;
60	[
61		//NUL		SOH			STX			ETX			EOT			ENQ			ACK			BEL			BS			HT			LF			VT			FF			CR			SO			SI
62		Space,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Space,		Space,		Wrong,		Wrong,		Space,		Wrong,		Wrong,
63
64		//DLE		DC1			DC2			DC3			DC4			NAK			SYN			ETB			CAN			EM			SUB			ESC			FS			GS			RS			US
65		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,		Wrong,
66
67		//SP		!			"			#			$			%			&			'			(			)			*			+			,			-			.			/
68		Space,		Fn1(inv),	Temp,		Special,	Temp,		Fn2(ph2),	Temp,		Value,		Value,		Wrong,		Fn2(mul),	Fn2(add),	Cmd(phc),	Fn2(sub),	Special,	Fn2(div),
69
70		//0			1			2			3			4			5			6			7			8			9			:			;			<			=			>			?
71		Value,		Value,		Value,		Value,		Value,		Value,		Value,		Value,		Value,		Value,		Special,	Cmd(phc),	Fn2(ph2),	Fn2(ph2),	Fn2(ph2),	Special,
72
73		//@			A			B			C			D			E			F			G			H			I			J			K			L			M			N			O
74		Value,		Temp,		Temp,		Cmd(phc),	Cmd(phc),	Temp,		Value,		Temp,		Temp,		Cmd(phc),	Temp,		Cmd(phc),	CmdR(phr),	Temp,		Temp,		Cmd(phc),
75
76		//P			Q			R			S			T			U			V			W			X			Y			Z			[			\			]			^			_
77		Special,	Special,	Cmd(phc),	CmdR(phr),	Value,		Temp,		Temp,		Temp,		Special,	Temp,		Temp,		Value,		Special,	Wrong,		Fn2(pow),	Temp,
78
79		//`			a			b			c			d			e			f			g			h			i			j			k			l			m			n			o
80		Special,	Temp,		Temp,		Cmd(phc),	Cmd(phc),	Temp,		Temp,		Temp,		Temp,		Cmd(phc),	Temp,		Cmd(phc),	CmdR(phr),	Temp,		Temp,		Cmd(phc),
81
82		//p			q			r			s			t			u			v			w			x			y			z			{			|			}			~			DEL
83		Special,	Special,	Cmd(phc),	CmdR(phr),	Temp,		Temp,		Temp,		Temp,		Special,	Temp,		Temp,		Temp,		Fn3(ph3),	Temp,		Fn2(ph2),	Wrong
84	]
85};