From 3b934b8e6c9b43b9fb9599bed3ff4e50af3bc77d Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 19 Feb 2016 21:36:29 -0500 Subject: Add more productions, special tokens, etc. --- (limited to 'parsing/lexer.sh') 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 -- cgit v0.9.1