diff options
Diffstat (limited to 'parsing/lexer.sh')
-rw-r--r-- | parsing/lexer.sh | 66 |
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 } |