summaryrefslogtreecommitdiffstats
path: root/parsing/lexer.sh
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/lexer.sh')
-rw-r--r--parsing/lexer.sh66
1 files changed, 44 insertions, 22 deletions
diff --git a/parsing/lexer.sh b/parsing/lexer.sh
index 928021e..a3ab762 100644
--- a/parsing/lexer.sh
+++ b/parsing/lexer.sh
@@ -1,5 +1,6 @@
fname=
lineno=
+start=
c=
tok=
tokens=
@@ -399,9 +400,9 @@ scan_wordexp()
;;
*)
# Command substitution
- if ! res="$(parse_sub "${fname}" \
- ${lineno} "${c}" false)"
- then
+ if ! res="$(run_sublexer "sub${fname}" \
+ ${lineno} "${start}" \
+ "${c}")"; then
exit 1
fi
ln_off=${res%%${RS}*}
@@ -411,7 +412,7 @@ scan_wordexp()
toks="${res%%${RS}*}"
lineno=${ln_off}
wordexp="\$(${STX}${toks}${ETX})"
- # ")" is recognized in parse_sub().
+ # ")" is recognized in run_sublexer().
;;
esac
;;
@@ -608,42 +609,63 @@ error()
exit 1
}
-init_lexer()
+run_sublexer()
{
local fn="${1}"
local ln="${2}"
- local char="${3}"
- shift 3
+ local st="${3}"
+ local ch="${4}"
+ shift 4
+ # Initialize global variables.
fname="${fn}"
lineno=${ln}
+ start="${st}"
tokens=''
- case "${char}" in
- '')
- pgetc
+
+ c="${ch}"
+ next
+
+ #dbg=true
+ # If this returns (does not exit), there are no errors.
+ ${start}
+ case "${tok%${US}*}" in
+ T_RPAREN)
;;
*)
- c="${char}"
+ synerr 'Missing ")"'
;;
esac
- next
-}
-get_lineno()
-{
- printf '%d' ${lineno}
+ printf "%d${RS}%c${RS}%s" ${lineno} "${c}" "${tokens}"
return 0
}
-get_lexer_char()
+run_lexer()
{
- printf '%c' "${c}"
- return 0
-}
+ local fn="${1}"
+ local st="${2}"
+ shift 2
-get_tokens()
-{
+ # Initialize global variables.
+ fname="${fn}"
+ lineno=1
+ start="${st}"
+ tokens=''
+
+ # Read the first character and recognize the first token.
+ pgetc
+ next
+
+ # If this returns (does not exit), there are no errors.
+ ${start}
+ if ! accept T_EOF; then
+ synexp ''
+ fi
+
+ # Return the tokens.
printf '%s' "${tokens}"
+
return 0
}