#!/usr/bin/env bash set -euo pipefail # Dev sugar pre-expander (safe, zero-semantics changes) # Applies, in order: # - @name[: Type] = expr => local name[: Type] = expr # - elif cond { => else if cond { # - a += b (and -=, *=, /=) as statements # - i++ / i-- as statements (not expressions) # Usage: # tools/dev/dev_sugar_preexpand.sh < input.hako > output.hako # or tools/dev/dev_sugar_preexpand.sh input.hako > output.hako in="${1:-}" if [ -n "$in" ]; then exec <"$in" fi # 1) @ local alias "$(dirname "$0")/at_local_preexpand.sh" | \ # 2) compound assignments (+=, -=, *=, /=), statements only; skip comment lines sed -E \ -e '/^[[:space:]]*\/\//b' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*\+=\s*(.+)$/\1\2 = \2 + \3/' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*\-=\s*(.+)$/\1\2 = \2 - \3/' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*\*=\s*(.+)$/\1\2 = \2 * \3/' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*\/=\s*(.+)$/\1\2 = \2 \/ \3/' | \ # 3) i++ / i-- as statements, skip comment lines sed -E \ -e '/^[[:space:]]*\/\//b' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*\+\+[[:space:]]*$/\1\2 = \2 + 1/' \ -e 's/^([[:space:]]*)([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*--[[:space:]]*$/\1\2 = \2 - 1/' | \ # 4) when cond { ... } → if cond { ... } (line-head only), skip comments sed -E '/^[[:space:]]*\/\//b; s/^([[:space:]]*)when\b/\1if/' | \ # 5) print! expr → print(expr) (line-head only; allow zero or more spaces after '!') sed -E '/^[[:space:]]*\/\//b; s/^([[:space:]]*)print![[:space:]]*(.+)$/\1print(\2)/'