summaryrefslogtreecommitdiffstats
path: root/parsing/lexer.sh
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/lexer.sh')
-rw-r--r--parsing/lexer.sh45
1 files changed, 44 insertions, 1 deletions
diff --git a/parsing/lexer.sh b/parsing/lexer.sh
index f92534a..c939d1c 100644
--- a/parsing/lexer.sh
+++ b/parsing/lexer.sh
@@ -455,13 +455,15 @@ scan_param()
accept()
{
local t="${1}"
+ local rw=
case "${t}" in
T_IF|T_THEN|T_ELSE|T_ELIF|T_FI|\
T_DO|T_DONE|T_CASE|T_ESAC|T_WHILE|T_UNTIL|\
T_FOR|T_LBRACE|T_RBRACE|T_BANG|T_IN)
+ dbg "looking for reserved word $t, have '$tok'"
# Reserved words are recognized as literal T_WORDs.
- if ! [ "x${tok%%${US}*}" = T_WORD ]; then
+ if ! [ "x${tok%%${US}*}" = 'xT_WORD' ]; then
return 1
fi
# T_WORD data unit must match reserved word exactly.
@@ -473,6 +475,47 @@ accept()
# with the reserved word token.
tok="${t}"
;;
+ T_NAME)
+ # Names are recognized as literal T_WORDs.
+ if ! [ "x${tok%%${US}*}" = 'xT_WORD' ]; then
+ return 1
+ fi
+ # Validate name.
+ case "${tok%%${US}*}" in
+ [A-Za-z_][0-9A-Za-z_]*)
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+ tok="T_NAME${US}${tok#T_WORD${US}}"
+ ;;
+ T_FNAME)
+ # Function names are recognized as literal T_WORDs.
+ if ! [ "x${tok%%${US}*}" = 'xT_WORD' ]; then
+ return 1
+ fi
+ # Validate name.
+ case "${tok%%${US}*}" in
+ [A-Za-z_][0-9A-Za-z_]*)
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+ # Verify that the function name doesn't match any
+ # reserved words.
+ for rw in T_IF T_THEN T_ELSE T_ELIF T_FI T_DO T_DONE \
+ T_CASE T_ESAC T_WHILE T_UNTIL T_FOR \
+ T_IN; do
+ if [ "x${tok#T_WORD${US}}" = \
+ "x$(tokname "${rw}")" ]; then
+ tok="${rw}"
+ return 1
+ fi
+ done
+ tok="T_FNAME${US}${tok#T_WORD${US}}"
+ ;;
*)
if ! [ "x${tok%%${US}*}" = "x${t}" ]; then
return 1