aat

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

commit a345b6074a9574a5e5b08384118f37f12aa4b916
parent f6c426fdb32cc3ede30dc98486811f8763503d14
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Thu, 20 Aug 2015 13:26:21 +0200

filters and quoted string defaults in query.pl, tests using shelltestrunner
Diffstat:
Aq | 2++
Mquery.pl | 96+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Aquery.test | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 157 insertions(+), 39 deletions(-)

diff --git a/q b/q @@ -0,0 +1,2 @@ +#!/bin/zsh +exec swipl -q -g main -s $0:h/query.pl =(cat) diff --git a/query.pl b/query.pl @@ -18,21 +18,31 @@ query_default_text([H|T]) --> [H], {\+memberchk(H,`'<>`)}, query_default_text(T) query_default_text([]) --> []. query_content([name(Name)|T]) --> query_name(Name), query_content(T). -query_content([query(Query)|T]) --> query_exp(Query), query_content(T). query_content([expr(Expr)|T]) --> `'`, query_awk(Expr), `'`, query_content(T). +query_content([query(Query, Filters, Default)|T]) --> + query_exp(Query, Filters, Default), query_content(T). query_content([]) --> []. -%query_default([text(Text)|T]) --> query_default_text(Text), query_default(T). +query_default([string(String)|T]) --> awk_string(String), query_default(T). query_default([expr(Expr)|T]) --> `'`, query_awk(Expr), `'`, query_default(T). -query_default([query(Query)|T]) --> query_exp(Query), query_default(T). -query_default([query(Query, Default)|T]) --> - query_exp(Query, Default), query_default(T). +% query_default([query(Query)|T]) --> query_exp(Query), query_default(T). +query_default([query(Query, Filters, Default)|T]) --> + query_exp(Query, Filters, Default), query_default(T). query_default([]) --> []. -query_exp(Content) --> `<`, query_content(Content), `>`. +query_exp(Content, Filters, Default) --> + `<`, + query_content(Content), + query_exp_filters(Filters), + query_exp_default(Default), + `>`. -query_exp(Content, Default) --> - `<`, query_content(Content), `:`, query_default(Default), `>`. +query_exp_filters([H|T]) --> + `|`, query_name(H), query_exp_filters(T). +query_exp_filters([]) --> []. + +query_exp_default(none) --> []. +query_exp_default(Default) --> `:`, query_default(Default). awk_string(String) --> `"`, awk_string_content(String), `"`. @@ -74,11 +84,8 @@ awk_code([H|T],R,Prev,F) --> awk_code(R,R,L,L) --> []. % awk_code(L) --> awk_code(L,[],delim,_). -query_awk([query(Query, Default)|T],delim) --> - query_exp(Query, Default), - query_awk(T, expr). -query_awk([query(Query)|T],delim) --> - query_exp(Query), +query_awk([query(Query, Filters, Default)|T],delim) --> + query_exp(Query, Filters, Default), query_awk(T, expr). query_awk([code(Code)|T], Last) --> awk_code(Code, [], Last, Next), @@ -89,35 +96,46 @@ query_awk(L) --> query_awk(L,delim). %%% -awk_out([code(Code)|T]) --> Code, awk_out(T). -awk_out([query(Query)|T]) --> `get(`, query_out(Query), `)`, awk_out(T). -awk_out([query(Query, Default)|T]) --> - `(find(`, query_out(Query), `)?found:`, default_out(Default), `)`, awk_out(T). -awk_out([]) --> []. - -query_out([name(Name)|T]) --> `"`, Name, `"`, query_out(T). -query_out([query(Query)|T]) --> `get(`, query_out(Query), `)`, query_out(T). -query_out([query(Query, Default)|T]) --> - `(find(`, query_out(Query), `)?found:`, default_out(Default), `)`, query_out(T). -query_out([expr(Expr)|T]) --> `(`, awk_out(Expr), `)`, query_out(T). -query_out([]) --> []. - -default_out([]) --> `""`. -default_out([H|T]) --> default_out_aux([H|T]). -%default_out_aux([text(Text)|T]) --> Text, default_out_aux(T). -default_out_aux([query(Query)|T]) --> - `get(`, query_out(Query), `)`, default_out_aux(T). -default_out_aux([query(Query, Default)|T]) --> - `(find(`, query_out(Query), `)?found:`, default_out(Default), `)`, - default_out_aux(T). -default_out_aux([expr(Expr)|T]) --> `(`, awk_out(Expr), `)`, default_out_aux(T). -default_out_aux([]) --> []. +out_awk([code(Code)|T]) --> Code, out_awk(T). +out_awk([query(Query, Filters, Default)|T]) --> + out_query(Query, Filters, Default), out_awk(T). +out_awk([]) --> []. + +out_query(Query, Filters, none) --> + out_filters(Filters, out_f_get(Query)). +out_query(Query, Filters, Default) --> + `(find(`, out_query_content(Query), `)?`, + out_filters(Filters, out_f_found), + `:`, out_default(Default), `)`. + +out_f_get(Query) --> + `get(`, out_query_content(Query), `)`. + +out_f_found --> `found`. + +out_filters([H|T], Pred) --> + H, `(`, out_filters(T, Pred), `)`. +out_filters([], Pred) --> call(Pred). + +out_query_content([name(Name)|T]) --> `"`, Name, `"`, out_query_content(T). +out_query_content([expr(Expr)|T]) --> `(`, out_awk(Expr), `)`, out_query_content(T). +out_query_content([query(Query, Filters, Default)|T]) --> + out_query(Query, Filters, Default), out_query_content(T). +out_query_content([]) --> []. + +out_default([]) --> `""`. +out_default([H|T]) --> out_default_aux([H|T]). +out_default_aux([string(String)|T]) --> awk_string(String), out_default_aux(T). +out_default_aux([expr(Expr)|T]) --> `(`, out_awk(Expr), `)`, out_default_aux(T). +out_default_aux([query(Query, Filters, Default)|T]) --> + out_query(Query, Filters, Default), out_default_aux(T). +out_default_aux([]) --> []. %%% main([InFile]) :- - phrase_from_file(query_awk(Awk), InFile), - phrase(awk_out(Awk), Out), + (phrase_from_file(query_awk(Awk), InFile) -> true ; throw(parsing_failed)), + (phrase(out_awk(Awk), Out) -> true ; throw(formatting_failed(Awk))), format('~s', [Out]). -main([]) :- main("/dev/stdin"). +main([]) :- main(["/dev/stdin"]). diff --git a/query.test b/query.test @@ -0,0 +1,98 @@ +true +>>>= 0 + +false +>>>= 1 + +./q +<<< +BEGIN { +} +>>> +BEGIN { +} +>>>= 0 + +./q +<<< + foo(<bar>) +>>> + foo(get("bar")) +>>>= 0 + +./q +<<< + x[<y<z>>] = <a'b()'> +>>> + x[get("y"get("z"))] = get("a"(b())) +>>>= 0 + +./q +<<< + y = "" +>>> + y = "" +>>>= 0 + +./q +<<< + y = (y) (<c:>) +>>> + y = (y) ((find("c")?found:"")) +>>>= 0 + +./q +<<< + y = (y) (<d:'0'>) +>>> + y = (y) ((find("d")?found:(0))) +>>>= 0 + +./q +<<< + y = (y) (<e:<f>>) +>>> + y = (y) ((find("e")?found:get("f"))) +>>>= 0 + +./q +<<< + y = (y) (<g:<h:<i>>>) +>>> + y = (y) ((find("g")?found:(find("h")?found:get("i")))) +>>>= 0 + +./q +<<< + y = (y) (<g:<h:<i:'<j> - (<k:'0'>)'>>>) +>>> + y = (y) ((find("g")?found:(find("h")?found:(find("i")?found:(get("j") - ((find("k")?found:(0)))))))) +>>>= 0 + +./q +<<< + y = (y) (<g:<h:<i:'(<j>) - (<k:'0'>)'>>>) +>>> + y = (y) ((find("g")?found:(find("h")?found:(find("i")?found:((get("j")) - ((find("k")?found:(0)))))))) +>>>= 0 + +./q +<<< + y = (y) (<a|C:'"r\n"'>) +>>> + y = (y) ((find("a")?C(found):("r\n"))) +>>>= 0 + +./q +<<< + y = (y) (<a|C:"r\n">) +>>> + y = (y) ((find("a")?C(found):"r\n")) +>>>= 0 + +./q +<<< + y = (y) (<a|C>) +>>> + y = (y) (C(get("a"))) +>>>= 0