#!/bin/awk -f
BEGIN {
	in_string = 0
}

function out(str) {
	if(length(str)) {
		printf "%s", str
		last_out = str
	}
}

# called for expanding {< >}
# global variable expand_remaining used as input
function expand_query(    expanded) {
	if(DEBUG) printf "E: →%s←\n", expand_remaining >"/dev/stderr"
	expanded = ""
	while(match(expand_remaining, "['<>]")) {
		if(RSTART > 1) {
			expanded = expanded "\"" substr(expand_remaining, 1, RSTART-1) "\""
			if(DEBUG) printf "e: →%s←\n", expanded >"/dev/stderr"
		}
		char = substr(expand_remaining, RSTART, 1)
		expand_remaining = substr(expand_remaining, RSTART+1)
		if(char == ">")
			return "get("expanded")"
		else if(char == "<") {
			expanded = expanded expand_query()
			if(DEBUG) printf "e: →%s←\n", expanded >"/dev/stderr"
		} else if(char == "'") {
			if(match(expand_remaining, "'")) {
				expanded = expanded "(" substr(expand_remaining, 1, RSTART-1) ")"
				if(DEBUG) printf "e: →%s←\n", expanded >"/dev/stderr"
				expand_remaining = substr(expand_remaining, RSTART+1)
			} else {
				expanded = expanded "(" expand_remaining ")"
				if(DEBUG) printf "e: →%s←\n", expanded >"/dev/stderr"
				expand_remaining = ""
			}
		} else {
			print "ERROR: internal error in expand_query()" >"/dev/stderr"
			exit 1
		}
	}
	if(expand_remaining) {
		expanded = expanded "\"" expand_remaining "\""
		if(DEBUG) printf "e: →%s←\n", expanded >"/dev/stderr"
		expand_remaining = ""
	}
	return "get("expanded")"
}

function parse_line(line) {
	while(length(line)) {
		if(DEBUG) printf "%d: →%s←\n", in_string, line >"/dev/stderr"
		if(in_string) {
			if(match(line, /^(\\.|[^"\\])+/)) {
				out(substr(line, 1, RLENGTH))
				line = substr(line, RLENGTH+1)
			}
			if(match(line, /^"/)) {
				out("\"")
				line = substr(line, 2)
				in_string = 0
			} else if(match(line, /^\\$/)) {
				out("\\")
				line = ""
			} else if(!line) {
				# is this valid?
			} else {
				print "string parsing error" >"/dev/stderr"
				if(DEBUG) printf "%d: →%s←\n", in_string, line >"/dev/stderr"
				exit 1
			}
		} else if(match(line, /^#/)) {
			out(line)
			line = ""
		} else if(match(line, /[<"]/)) {
			out(substr(line, 1, RSTART-1))
			line = substr(line, RSTART)
			if(match(line, /^"/)) {
				line = substr(line, 2)
				in_string = 1
				out("\"")
			} else {
				if(DEBUG) printf "q: →%s← →%s←\n", last_out, line >"/dev/stderr"
				if( \
					match(last_out, /[[( \n\t]$/) && \
					match(line, /^<([a-zA-Z0-9._<>]|'[^']*')*>/) \
				) {
					expand_remaining = substr(line, 2, RLENGTH-2)
					line = substr(line, RLENGTH+1)
					out(expand_query())
				} else if(match(line, /^<[^<"]*/)) {
					if(DEBUG) printf("SKIP: →%s← →%s← →%s←\n", last_out, \
						substr(line, 1, RLENGTH), substr(line, RLENGTH+1) \
						) >"/dev/stderr"
					out(substr(line, 1, RLENGTH))
					line = substr(line, RLENGTH+1)
				} else {
					out(line)
					line = ""
				}
			}
		} else {
			out(line)
			line = ""
		}
	}
	out("\n")
}

{ parse_line($0) }