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:
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