summaryrefslogtreecommitdiffstats
path: root/parsing/parse.sh
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/parse.sh')
-rw-r--r--parsing/parse.sh22
1 files changed, 16 insertions, 6 deletions
diff --git a/parsing/parse.sh b/parsing/parse.sh
index a28aad2..4d4b9ea 100644
--- a/parsing/parse.sh
+++ b/parsing/parse.sh
@@ -583,20 +583,28 @@ sequential_sep()
return 1
}
+# Maybe parse() should just tell the lexer what the starting production (parser
+# entry point) is.
parse_sub()
{
local fn="${1}"
local ln="${2}"
- shift 2
+ local lexer_char="${3}"
+ local complete="${4}"
+ shift 3
- init_lexer "${fn}" ${ln}
+ init_lexer "${fn}" ${ln} "${lexer_char}"
# If this returns (does not exit), there are no errors.
complete_command
- if ! accept T_EOF; then
+ if ${complete} && ! accept T_EOF; then
synexp ''
fi
+ get_lineno
+ printf '%c' "${RS}"
+ get_lexer_char
+ printf '%c' "${RS}"
get_tokens
return 0
@@ -606,8 +614,10 @@ parse()
{
local fn="${1}"
shift 1
+ local toks=
- if parse_sub "${fn}" 1; then
+ if toks="$(parse_sub "${fn}" 1 '' true)"; then
+ printf '%s\n' "${toks#*${RS}*${RS}}"
return 0
fi
return 1
@@ -640,7 +650,7 @@ try()
}
#try '"foo bar" && $baz || qux' '${quux%uux quuux'
-try '"foo bar" && $baz || qux' '${quux%uux } quuux'
+#try '"foo bar" && $baz || qux' '${quux%uux } quuux'
#try 'foo ${bar}'
#try 'foo ${#bar}'
#try 'foo ${bar#baz}'
@@ -659,5 +669,5 @@ try '"foo bar" && $baz || qux' '${quux%uux } quuux'
#try 'foo(){ bar; }'
#try 'case foo in bar) baz;; (qux) quux;; quux);; esac'
#try 'foo bar ( baz )'
-#try 'foo $(bar)'
+try 'foo $(bar)'
#try 'foo $((1 + 1))'