aat

git mirror of https://ccx.te2000.cz/bzr/aat
git clone https://ccx.te2000.cz/git/aat
Log | Files | Refs | README

commit b10a8a19de76737e120531bc71f0faaec6b1e75a
parent f29e932fd58f268316423f6937d7e0e20e4ea48a
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Wed,  9 Sep 2015 18:23:54 +0200

more tests,  print out correct variable name from get()
Diffstat:
Maat_data.test | 46++++++++++++++++++++++++++++++++++++++++++++++
Maattest | 5++++-
Mdata.awk | 2+-
Mquery.pl | 2+-
Mquery.test | 386++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Aquerytest | 9+++++++++
6 files changed, 434 insertions(+), 16 deletions(-)

diff --git a/aat_data.test b/aat_data.test @@ -1,5 +1,15 @@ ./aattest tests/data1 <<< +|BEGIN { +|print "Hello!" +|} +>>> +Hello! +>>>2 +>>>= 0 + +./aattest tests/data2 +<<< @awk ../../data.awk |END{ Hello {<name>}! @@ -10,3 +20,39 @@ name=world Hello world! >>>2 >>>= 0 + +./aattest tests/data3 +<<< +@awk ../../data.awk +|END{ +Hello {<name:"everyone">}! +|} +--- +name=world +>>> +Hello world! +>>>2 +>>>= 0 + +./aattest tests/data4 +<<< +@awk ../../data.awk +|END{ +Hello {<name:"everyone">}! +|} +--- +>>> +Hello everyone! +>>>2 +>>>= 0 + +./aattest tests/data5 +<<< +@awk ../../data.awk +|END{ +Hello {<name>}! +|} +--- +>>> /Makefile:.*failed/ +>>>2 /error: undefined variable 'name'/ +>>>= 2 diff --git a/aattest b/aattest @@ -19,7 +19,10 @@ test.out: test.data test.qawk awk -f test.qawk DEBUG=\$(DEBUG) test.data >test.out test.qawk: test.awk - awk -f $bin/query.awk <test.awk >test.qawk + swipl -q -g main -s $bin:h/query.pl test.awk >test.qawk + +# test.qawk: test.awk +# awk -f $bin/query.awk <test.awk >test.qawk test.awk: test.mac sed -f $bin/aat_macros.sed <test.mac >test.awk diff --git a/data.awk b/data.awk @@ -136,7 +136,7 @@ function find(varname, i, n, names, values, loopvar, looprow, prefix) { function get(varname) { if(!find(varname)) { - print "error: undefined variable '"$varname"'" >"/dev/stderr" + print "error: undefined variable '"varname"'" >"/dev/stderr" exit 1 } if(DEBUG) { diff --git a/query.pl b/query.pl @@ -74,7 +74,7 @@ awk_comment([H|T],R) --> [H], {assertion(H \= 0'\n)}, !, awk_comment(T,R). -awk_comment(L) --> awk_comment(L,[]). +% awk_comment(L) --> awk_comment(L,[]). awk_code([0'"|T0],R,_,F) --> `"`, !, awk_string_content(T0,T1), `"`, { T1=[0'"|T2] }, awk_code(T2,R,expr,F). diff --git a/query.test b/query.test @@ -1,4 +1,4 @@ -./q +./querytest tests/query1 <<< BEGIN { } @@ -8,7 +8,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query2 <<< foo(<bar>) >>> @@ -16,7 +16,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query3 <<< x[<y<z>>] = <a'b()'> >>> @@ -24,7 +24,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query4 <<< y = "" >>> @@ -32,7 +32,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query5 <<< y = (y) (<c:>) >>> @@ -40,7 +40,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query6 <<< y = (y) (<d:'0'>) >>> @@ -48,7 +48,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query7 <<< y = (y) (<e:<f>>) >>> @@ -56,7 +56,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query8 <<< y = (y) (<g:<h:<i>>>) >>> @@ -64,7 +64,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query9 <<< y = (y) (<g:<h:<i:'<j> - (<k:'0'>)'>>>) >>> @@ -72,7 +72,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query10 <<< y = (y) (<g:<h:<i:'(<j>) - (<k:'0'>)'>>>) >>> @@ -80,7 +80,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query11 <<< y = (y) (<a|C:'"r\n"'>) >>> @@ -88,7 +88,7 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query12 <<< y = (y) (<a|C:"r\n">) >>> @@ -96,10 +96,370 @@ BEGIN { >>>2 >>>= 0 -./q +./querytest tests/query13 <<< y = (y) (<a|C>) >>> y = (y) (C(get("a"))) >>>2 >>>= 0 + +./querytest tests/query14 +<<< +#!/bin/awk -f +>>> +#!/bin/awk -f +>>>2 +>>>= 0 + +./querytest tests/query15 +<<< +#!/bin/awk -f +BEGIN { + print "Hello!" +} +>>> +#!/bin/awk -f +BEGIN { + print "Hello!" +} +>>>2 +>>>= 0 + +./querytest tests/query16 +<<< +#!/bin/awk -f +BEGIN { + FS="\t" + SUBSEP="." + state = 0 + # 0 read normal variables + # 1 seen start of field list, read titles + # 2 reading list values + # ident_re = /[a-zA-Z_][a-zA-Z0-9_]*/ + ident_re = "[a-zA-Z_][a-zA-Z0-9_]*" +} +>>> +#!/bin/awk -f +BEGIN { + FS="\t" + SUBSEP="." + state = 0 + # 0 read normal variables + # 1 seen start of field list, read titles + # 2 reading list values + # ident_re = /[a-zA-Z_][a-zA-Z0-9_]*/ + ident_re = "[a-zA-Z_][a-zA-Z0-9_]*" +} +>>>2 +>>>= 0 + +./querytest tests/query17 +<<< +$0 == "]" && state == 2 { + # end of field list + state = 0 + next +} + +state == 2 { + V[varname,++V[varname,"rows"]] = $0 + next +} + +state == 1 { + if((varname, "fields") in V) { + if(V[varname,"fields"] != $0) { + print "data.awk: differing field definition for '"varname"'" >"/dev/stderr" + print "previous: '"V[varname,"fields"]"'" >"/dev/stderr" + print "current: '"$0"'" >"/dev/stderr" + exit 1 + } + } + V[varname,"fields"] = $0 + state = 2 + next +} +>>> +$0 == "]" && state == 2 { + # end of field list + state = 0 + next +} + +state == 2 { + V[varname,++V[varname,"rows"]] = $0 + next +} + +state == 1 { + if((varname, "fields") in V) { + if(V[varname,"fields"] != $0) { + print "data.awk: differing field definition for '"varname"'" >"/dev/stderr" + print "previous: '"V[varname,"fields"]"'" >"/dev/stderr" + print "current: '"$0"'" >"/dev/stderr" + exit 1 + } + } + V[varname,"fields"] = $0 + state = 2 + next +} +>>>2 +>>>=0 + +./querytest tests/query18 +<<< +/^del[ \t].*[a-zA-Z_][a-zA-Z0-9_.]$/ { + del_pattern = substr($0, 5) + for(varname in V) { + if (match(varname, del_pattern)) { + delete V[varname] + } + } +} + +/^[a-zA-Z_][a-zA-Z0-9_.]*=\[$/ { + # start of field list + state = 1 + m = match($0, ident_re) + varname = substr($0, m, RLENGTH) + next +} + +/^[a-zA-Z_][a-zA-Z0-9_.]*=/ { + m = match($0, ident_re) + varname = substr($0, m, RLENGTH) + V[varname] = substr($0, m+1+RLENGTH) + if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" + next +} + +/^\t/ { + V[varname] = V[varname] "\n" substr($0, 1) + next +} + +/^#/ { next } +/^$/ { next } +>>> +/^del[ \t].*[a-zA-Z_][a-zA-Z0-9_.]$/ { + del_pattern = substr($0, 5) + for(varname in V) { + if (match(varname, del_pattern)) { + delete V[varname] + } + } +} + +/^[a-zA-Z_][a-zA-Z0-9_.]*=\[$/ { + # start of field list + state = 1 + m = match($0, ident_re) + varname = substr($0, m, RLENGTH) + next +} + +/^[a-zA-Z_][a-zA-Z0-9_.]*=/ { + m = match($0, ident_re) + varname = substr($0, m, RLENGTH) + V[varname] = substr($0, m+1+RLENGTH) + if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" + next +} + +/^\t/ { + V[varname] = V[varname] "\n" substr($0, 1) + next +} + +/^#/ { next } +/^$/ { next } +>>>2 +>>>=0 + +./querytest tests/query19 +<<< +{ + # TODO posix compliance + print "data.awk: unparseable line: '"$0"'" >"/dev/stderr" + exit 1 +} + +function loop_start(varname, prefix, depth) { + depth = ++loop_stack["depth"] + loop_stack[depth,"row"] = 0 + loop_stack[depth,"var"] = varname + loop_stack[depth,"pre"] = prefix + return depth +} + +function loop_iter(depth) { + loop_stack[depth,"row"]++ + return (loop_stack[depth,"var"], loop_stack[depth,"row"]) in V +} + +function loop_end() { + delete loop_stack[loop_stack["depth"], "row"] + delete loop_stack[loop_stack["depth"], "var"] + delete loop_stack[loop_stack["depth"], "pre"] + loop_stack["depth"]-- +} + +function find(varname, i, n, names, values, loopvar, looprow, prefix) { + for(i=loop_stack["depth"]; i>0; i--) { + prefix = loop_stack[i, "pre"] + if(prefix) + if(substr(varname, 1, length(prefix)) != prefix) + continue + loopvar = loop_stack[i, "var"] + looprow = loop_stack[i, "row"] + if(varname == prefix"_index") + return looprow + if(varname == prefix"_index0") + return looprow - 1 + if(varname == prefix"_revindex") + return V[loopvar, "rows"] - looprow + 1 + if(varname == prefix"_revindex0") + return V[loopvar, "rows"] - looprow + if(varname == prefix"_first") + return looprow == 1 + if(varname == prefix"_last") + return looprow == V[loopvar, "rows"] + if(varname == prefix"_length") + return V[loopvar, "rows"] + split(V[loopvar, "fields"], names) + for(n in names) { + if(varname == (prefix names[n])) { + split(V[loopvar, looprow], values) + return values[n] + } + } + } + if(!(varname in V)) { + if(DEBUG) { + print "variable not found: " varname >"/dev/stderr" + } + return 0 + } + found = V[varname] + return 1 +} + +function get(varname) { + if(!find(varname)) { + print "error: undefined variable '"varname"'" >"/dev/stderr" + exit 1 + } + if(DEBUG) { + print "get →" varname "← ⇒ →"found"←" >"/dev/stderr" + } + return found +} + +function or_(a, b) { + return a ? a : b +} + +END { + if(DEBUG) { + print "--- loaded keys ---" >"/dev/stderr" + for(key in V) + printf("%s\t→%s←\t", key, V[key]) >"/dev/stderr" + printf(">> %d →%s←\n", find(key), found) >"/dev/stderr" + print "-------------------" >"/dev/stderr" + } +} +>>> +{ + # TODO posix compliance + print "data.awk: unparseable line: '"$0"'" >"/dev/stderr" + exit 1 +} + +function loop_start(varname, prefix, depth) { + depth = ++loop_stack["depth"] + loop_stack[depth,"row"] = 0 + loop_stack[depth,"var"] = varname + loop_stack[depth,"pre"] = prefix + return depth +} + +function loop_iter(depth) { + loop_stack[depth,"row"]++ + return (loop_stack[depth,"var"], loop_stack[depth,"row"]) in V +} + +function loop_end() { + delete loop_stack[loop_stack["depth"], "row"] + delete loop_stack[loop_stack["depth"], "var"] + delete loop_stack[loop_stack["depth"], "pre"] + loop_stack["depth"]-- +} + +function find(varname, i, n, names, values, loopvar, looprow, prefix) { + for(i=loop_stack["depth"]; i>0; i--) { + prefix = loop_stack[i, "pre"] + if(prefix) + if(substr(varname, 1, length(prefix)) != prefix) + continue + loopvar = loop_stack[i, "var"] + looprow = loop_stack[i, "row"] + if(varname == prefix"_index") + return looprow + if(varname == prefix"_index0") + return looprow - 1 + if(varname == prefix"_revindex") + return V[loopvar, "rows"] - looprow + 1 + if(varname == prefix"_revindex0") + return V[loopvar, "rows"] - looprow + if(varname == prefix"_first") + return looprow == 1 + if(varname == prefix"_last") + return looprow == V[loopvar, "rows"] + if(varname == prefix"_length") + return V[loopvar, "rows"] + split(V[loopvar, "fields"], names) + for(n in names) { + if(varname == (prefix names[n])) { + split(V[loopvar, looprow], values) + return values[n] + } + } + } + if(!(varname in V)) { + if(DEBUG) { + print "variable not found: " varname >"/dev/stderr" + } + return 0 + } + found = V[varname] + return 1 +} + +function get(varname) { + if(!find(varname)) { + print "error: undefined variable '"varname"'" >"/dev/stderr" + exit 1 + } + if(DEBUG) { + print "get →" varname "← ⇒ →"found"←" >"/dev/stderr" + } + return found +} + +function or_(a, b) { + return a ? a : b +} + +END { + if(DEBUG) { + print "--- loaded keys ---" >"/dev/stderr" + for(key in V) + printf("%s\t→%s←\t", key, V[key]) >"/dev/stderr" + printf(">> %d →%s←\n", find(key), found) >"/dev/stderr" + print "-------------------" >"/dev/stderr" + } +} +>>>2 +>>>= 0 diff --git a/querytest b/querytest @@ -0,0 +1,9 @@ +#!/bin/zsh +dst=$1 +query=$0:h:a/query.pl +[[ -d $dst ]] && rm -r $dst +mkdir -p $dst || exit $? + +cat >$dst/test.qawk || exit $? + +exec swipl -q -g main -s $query $dst/test.qawk