aboutsummaryrefslogtreecommitdiff
path: root/tools/replace.nom
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-01-14 15:42:48 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-01-14 15:43:24 -0800
commitc1c32688a4afc43f6addb99b8b5fa878944a70e3 (patch)
treec886f21b5b08a9053aa74fcba4b241dae5ede76d /tools/replace.nom
parent2309b696fc34b24f05f6658b94f9105ca8ee76e4 (diff)
Overhaul in progress, mostly working. Moved all the nomsu packages into
lib/, including core/*. Changes to how nomsu environments and importing work.
Diffstat (limited to 'tools/replace.nom')
-rwxr-xr-xtools/replace.nom145
1 files changed, 0 insertions, 145 deletions
diff --git a/tools/replace.nom b/tools/replace.nom
deleted file mode 100755
index f4df0e4..0000000
--- a/tools/replace.nom
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env nomsu -V6.14
-#
- This is a tool to replace syntax trees with something new.
-
- Usage:
- nomsu -t replace [-i] [-f] [-q] [--literal="$v1 $v2..."] <pattern> <replacement> file1 file2...
-
- Example:
- nomsu -t replace "($1 and $2) and $3" "all of [$1, $2, $3]" my_file.nom
-
- If the "-i" flag is used, the file(s) will be edited in-place.
- When editing in-place, if the "-f" flag is not used, each change will be
- run past the user first.
- If the "-q" flag is used and a file fails to parse, the original file
- contents will be output.
- If no files are passed in, this will read from stdin.
-
-use "lib/os"
-use "lib/consolecolor"
-
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-if ((#$(COMMAND LINE ARGS).extras) < 2):
- fail ("
- Usage: nomsu -t replace [--literal="$v1 $v2..."] <pattern> <replacement> file1 file2...
- ")
-$pattern = $(COMMAND LINE ARGS).extras.1
-$replacement = $(COMMAND LINE ARGS).extras.2
-$pattern_tree = ($pattern parsed)
-$replacement_tree = ($replacement parsed)
-$literal_vars = {}
-if $(COMMAND LINE ARGS).literal:
- for $var in ($(COMMAND LINE ARGS).literal, all matches of "$([^ ]*)"):
- $literal_vars.$var = (yes)
-
-if (($pattern_tree.type == "Var") and (not $literal_vars.($pattern_tree.1))):
- fail "Pattern matches every part of the file."
-
-$pattern_vars = {
- : for $ in recursive $pattern_tree:
- if (($.type == "Var") and (not $literal_vars.($.1))): add $.1
- for $child in $:
- if ($child is a "Syntax Tree"):
- recurse $ on $child
-}
-
-# TODO: support wildcards and unpacking
- e.g. nomsu -t replace "test(: $test; *$more_tests)" "*$more_tests; *$test"
-($tree matches $patt with $substitution_values) means:
- # TODO: optimize
- $substitution_values = {: for $k = $v in $substitution_values: add $k = $v}
- when:
- (not ($tree is syntax tree)): return (no)
- (($patt.type == "Var") and $pattern_vars.($patt.1)):
- if $substitution_values.($patt.1):
- if ($tree == $substitution_values.($patt.1)):
- return $substitution_values
- ..else:
- return (nil)
- ..else:
- $substitution_values.($patt.1) = $tree
- return $substitution_values
- ($tree.type != $patt.type): return (nil)
- ($tree.type == "Action"):
- if (($tree, get stub) != ($patt, get stub)): return (nil)
-
- for $ in 1 to (#$patt):
- if ($patt.$ is syntax tree):
- $new_values = ($tree.$ matches $patt.$ with $substitution_values)
- unless $new_values:
- return (nil)
-
- for $k = $v in $new_values:
- $substitution_values.$k = $v
- ..else:
- unless ($tree.$ == $patt.$): return (nil)
-
- if ((#$tree) != (#$patt)): return (nil)
- return $substitution_values
-$filenames = ($(COMMAND LINE ARGS).extras, from 3 to -1)
-if ((#$filenames) == 0):
- say ("
- Warning: searching stdin (ctrl-d to abort). To avoid this message, use nomsu -t find -
- ")
- $filenames = ["stdin"]
-
-for $filename in $filenames:
- $file = (read file $filename)
- unless $file:
- fail "File does not exist: \$filename"
- $code = (NomsuCode from ($Source $filename 1 (size of $file)) $file)
- try:
- $tree = ($code parsed)
- ..if it fails $msg:
- if $(COMMAND LINE ARGS).q:
- unless $(COMMAND LINE ARGS).i: say $code
- ..else:
- say $msg
-
- unless $tree:
- do next $filename
-
- $replaced = {}
- $matched = {}
- $user_answers = {}
- ($tree with replacements) means
- $tree, map
- for $t:
- $values = ($t matches $pattern_tree with {})
- if $values:
- $matched.$t = (yes)
- for $k = $v in $values:
- $values.$k = ($v with replacements)
- $ret = ($replacement_tree with vars $values)
- if ($(COMMAND LINE ARGS).i and (not $(COMMAND LINE ARGS).f)):
- if ($user_answers.$t == (nil)):
- if ((#$user_answers) > 0): say ""
- $user_answers.$t = "n"
- say "\(bright)Should this:"
- say ("
- \(bright)\(yellow)\("\(($t with replacements) as nomsu)", with "\n" -> "\n ")\
- ..\(reset color)
- ")
- say "\(bright)..be replaced with:"
-
- say ("
- \(bright)\(blue)\("\($ret as nomsu)", with "\n" -> "\n ")\(reset color)
- ")
-
- $user_answers.$t = (ask "\(bright)..? [Y/n]\(reset color) ")
-
- if ($user_answers.$t == "n"): return (nil)
- $replaced.$t = (yes)
- return $ret
- $tree2 = ($tree with replacements)
- if $(COMMAND LINE ARGS).i:
- if ((#$user_answers) > 0): say ""
- say ("
- \(#$replaced)/\(#$matched) replacement\("" if ((#$replaced) == 1) else "s") in \$filename
- ")
-
- if ((#$replaced) > 0):
- write "\($tree2 as nomsu)" to file $filename
- ..else:
- say ($tree2 as nomsu)