diff options
author | P. J. McDermott <pj@pehjota.net> | 2016-02-20 12:23:16 (EST) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2016-02-20 12:23:16 (EST) |
commit | ac6cc6b2405bb6d3775344a873fb1172f38f1c7e (patch) | |
tree | 8dd9d72f3a5fc3095418bdeb57c8b550f2784704 /parsing/lexer.sh | |
parent | e221064cecfad291e65609e7412f074a64a6f5e4 (diff) | |
download | eggshell-ac6cc6b2405bb6d3775344a873fb1172f38f1c7e.zip eggshell-ac6cc6b2405bb6d3775344a873fb1172f38f1c7e.tar.gz eggshell-ac6cc6b2405bb6d3775344a873fb1172f38f1c7e.tar.bz2 |
Implement command substitution (warning: ugly and broken)
Diffstat (limited to 'parsing/lexer.sh')
-rw-r--r-- | parsing/lexer.sh | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/parsing/lexer.sh b/parsing/lexer.sh index b03878d..1e9b2e0 100644 --- a/parsing/lexer.sh +++ b/parsing/lexer.sh @@ -276,6 +276,7 @@ scan_wordexp() local res= local param= local word= + local toks= wordexp='' ln_off=0 @@ -398,8 +399,30 @@ scan_wordexp() ;; *) # Command substitution - synerr 'Command substitution is %s' \ - 'not yet supported' + if ! res="$(parse_sub "${fname}" \ + ${lineno} "${c}" false)" + then + exit 1 + fi + ln_off=${res%%${RS}*} + res="${res#*${RS}}" + c="${res%%${RS}*}" + res="${res#*${RS}}" + toks="${res%%${RS}*}" + lineno=${ln_off} + wordexp="\$(${STX}${toks}${ETX}" + # Get ")" + case "${c}" in + ')') + wordexp="${wordexp}${c}" + pgetc + ;; + *) + echo "c: '$c'" >&2 + echo "wordexp: $wordexp" >&2 + synerr 'Missing ")"' + ;; + esac ;; esac ;; @@ -600,15 +623,35 @@ init_lexer() { local fn="${1}" local ln="${2}" - shift 2 + local char="${3}" + shift 3 fname="${fn}" lineno=${ln} tokens='' - pgetc + case "${char}" in + '') + pgetc + ;; + *) + c="${char}" + ;; + esac next } +get_lineno() +{ + printf '%d' ${lineno} + return 0 +} + +get_lexer_char() +{ + printf '%c' "${c}" + return 0 +} + get_tokens() { printf '%s' "${tokens}" |