From 73817529d600e36887ebb364623d55e07d8dc84a Mon Sep 17 00:00:00 2001 From: Michael Sippel Date: Sat, 7 Oct 2023 13:07:18 +0200 Subject: [PATCH] first samples for a potential command-type description language --- typeDB/cut | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ typeDB/date | 15 ++++++++++++ typeDB/dirname | 56 +++++++++++++++++++++++++++++++++++++++++++ typeDB/echo | 16 +++++++++++++ typeDB/seq | 25 +++++++++++++++++++ typeDB/xargs | 38 +++++++++++++++++++++++++++++ 6 files changed, 215 insertions(+) create mode 100644 typeDB/cut create mode 100644 typeDB/date create mode 100644 typeDB/dirname create mode 100644 typeDB/echo create mode 100644 typeDB/seq create mode 100644 typeDB/xargs diff --git a/typeDB/cut b/typeDB/cut new file mode 100644 index 0000000..e860067 --- /dev/null +++ b/typeDB/cut @@ -0,0 +1,65 @@ +::cut OPTION... [FILE]... { + + match OPTION... { + --help { <1 : Help~ ; } + --version { <1 : VersionInfo~ ; } + + * { + match OPTION... { + -f--fields LIST:~CutFieldList~ { + + ROW-DELIM = + match OPTION... { + -z--zero-terminated { '\0' } + * { '\n' } + }; + + IN-COL-DELIM = + match OPTION... { + -d--delimiter DELIM:Char { DELIM } + * { '\t' } + }; + + OUT-COL-DELIM = + match OPTION... { + --output-delimiter STRING: { STRING } + * { IN-COL-DELIM } + }; + + FILE : Path + ~> + ~ + ~ ; + + @FILE : >... > + ~> + ~ + ~> + ~ + ~ ; + + >0 : >... > + ~> + ~ + ~> + ~ + ~ ; + + # `[LIST]` means `select all fields contained in LIST from parameter pack` + <1 : >[LIST]... > + ~> + ~ + ~> + ~ + ~ ; + } + + * { + <1 : Nothing ; + <2 : MissingFields~ErrorMessage~ ; + } + } + } + } +} diff --git a/typeDB/date b/typeDB/date new file mode 100644 index 0000000..84edf45 --- /dev/null +++ b/typeDB/date @@ -0,0 +1,15 @@ +::date [OPTION]... [+FORMAT] { + match FORMAT { + "+%s" { + <1 : TimePoint + ~ + ~ + ~ℕ + ~ + ~~Char> + } + * { + <1 : TimePoint ; + } + } +} diff --git a/typeDB/dirname b/typeDB/dirname new file mode 100644 index 0000000..c94d46a --- /dev/null +++ b/typeDB/dirname @@ -0,0 +1,56 @@ +::dirname [OPTION] NAME... { + + # dont expect any data on stdin + # + + >0 : None ; + + + # each (non-option) argument must be a path + # + + NAME : Path + ~> + ~ + ~ + ~UTF-8 + ~ ; + + + matchopt OPTION { + + # help and version flags will bypass any data processing + # + + --help { <1 : Help~ ; } + --version { <1 : VersionInfo~ ; } + + + # in case neither --help nor --version is set + # ... + + * { + + # if zero-flag is set, use '\0' instead of '\n' + # as delimiter in output sequence + + DELIM = + match OPTION { + -z--zero { '\0' } + * { '\n' } + }; + + + # output a sequence of paths to stdout + # + + <1 : > + ~ + ~> + ~ + ~ ; + } + } +} diff --git a/typeDB/echo b/typeDB/echo new file mode 100644 index 0000000..6a6b9b6 --- /dev/null +++ b/typeDB/echo @@ -0,0 +1,16 @@ +::echo [OPTIONS]... [STRING]... { + >0 : None ; + + matchopt OPTION { + --help { <1 : Help~ ; } + --version { <1 : VersionInfo~ ; } + -n { + <1 : <* STRING~... > + ~ ; + } + * { + <1 : <* STRING~... '\n' > + ~ ; + } + } +} diff --git a/typeDB/seq b/typeDB/seq new file mode 100644 index 0000000..b585a9a --- /dev/null +++ b/typeDB/seq @@ -0,0 +1,25 @@ +::seq [OPTION]... [FIRST [INCREMENT]] LAST { + >0 : None ; + + match OPTION... { + --help { <1 : Help~ ; } + --version { <1 : VersionInfo~ ; } + * { + NUM = match OPTION... { + -f--format FORMAT { ℝ~~ } + * { ℤ~~~Char> } + }; + + SEP = match OPTION... { + -s--separator SEP { SEP } + * { '\n' } + }; + + $FIRST : NUM ; + $INCREMENT : NUM ; + $LAST : NUM ; + + <1 : >~~ ; + } + } +} diff --git a/typeDB/xargs b/typeDB/xargs new file mode 100644 index 0000000..6380730 --- /dev/null +++ b/typeDB/xargs @@ -0,0 +1,38 @@ +::xargs [OPTION]... [CMD [INITIAL-ARGS]...] { + + DELIM = + match OPTION... { + -0--null { '\0' } + -d--delimiter D:Char { D } + }; + + match OPTION... { + -a--argfile PATH => { + # type of data read from file at `path` + + @PATH : ARGS~... + ~> + ~ + ~ ; + } + * { + # type of data read from stdin + + >0 : ARGS~... + ~> + ~ + ~ ; + } + } + + match OPTION... { + -I REPLACE-STR { + # TODO : how to handle replacement ? + <1 : cmdtype <1 { CMD { INITIAL-ARGS where REPLACE-STR -> ARGS... } } ; + } + * { + <1 : cmdtype <1 { CMD INITIAL-ARGS... ARGS... } ; + } + } + +}