gfse: work in progress on support for example-based grammar writing

This commit is contained in:
hallgren
2011-09-27 18:40:09 +00:00
parent d097e6d9d5
commit 681b2c5501
4 changed files with 167 additions and 5 deletions

View File

@@ -0,0 +1,147 @@
var example_based=[];
/*
-- cat lincat fun lin fun cat cat
environ :: ([(CId, CId)],[(CId, Expr)],[((CId, CId), [CId])]) -> Environ
*/
function exb_state(g,ci) {
var conc=g.concretes[ci]
function show_list(show1,xs) {
return "["+map(show1,xs).join(",")+"]";
}
function show_fun(fun) {
var t=fun.type
var res=t[t.length-1]
var args=t.slice(0,length-1);
return "(("+fun.name+","+res+"),["+args.join(",")+"])"
}
function show_lincat(lincat) {
return "("+lincat.cat+","+lincat.type+")"
}
function show_lin(lin) {
return "("+lin.fun+","+lin.lin+")"
}
function show_funs(funs) { return show_list(show_fun,funs) }
function show_lincats(lincats) { return show_list(show_lincat,lincats); }
function show_lins(lins) { return show_list(show_lin,lins) }
return "("+show_lincats(conc.lincats)
+","+show_lins(conc.lins)
+","+show_funs(g.abstract.funs)+")"
}
function exb_call(g,ci,command,args,cont) {
var url="exb/exb.fcgi?command="+command+"&state="+exb_state(g,ci);
for(var arg in args) url+="&"+arg+"="+encodeURIComponent(args[arg]);
http_get_json(url,cont)
}
function ask_possibilities(g,ci) {
var conc=g.concretes[ci];
function show_poss(poss) {
//debug("possibilities: "+JSON.stringify(poss))
var exready={}
for(var i in poss[0]) exready[poss[0][i]]=true;
var testable={}
for(var i in poss[1]) testable[poss[1][i]]=true;
example_based[ci]={exready:exready,testable:testable}
conc.example_based=true;
conc.example_lang=g.concretes[0].langcode;
reload_grammar(g);
}
exb_call(g,ci,"possibilities",{},show_poss)
}
function exb_extra(g,ci) {
var conc=g.concretes[ci];
function stop_exb() {
conc.example_based=false;
reload_grammar(g);
}
function exblangmenu() {
function opt(conc) { return option(conc.langcode,conc.langcode); }
// skip target language
var m =node("select",{},map(opt,g.concretes));
m.onchange=function() { conc.example_lang=m.value }
return m
}
function ask_poss() { ask_possibilities(g,ci) }
if(navigator.onLine && conc.example_based && !example_based[ci]) ask_poss();
return conc.langcode=="Eng"
? indent([text("Example based editing: "),
conc.example_based
? node("span",{},[button("Stop",stop_exb),
text(" Example language: "),
exblangmenu()
])
: button("Start",ask_poss)])
: text("")
}
function exb_linbuttons(g,ci,f) {
var conc=g.concretes[ci];
var fun=f.fun;
var eb=example_based[ci];
var exb_output;
function fill_example(tree) {
exb_output.innerHTML="";
if(f.template) conc.lins.push({fun:f.fun,args:f.args,lin:tree});
else f.lin=s;
ask_possibilities(g,ci)
}
function show_example(example){
exb_output.innerHTML="";
var s=prompt(example[1]);
if(s) {
var t=function_type(g,fun);
var abscat=t[t.length-1]
var cat=cat_lincat(conc,abscat)
exb_output.innerHTML="...";
//server.parse({from:"ParseEng",cat:cat,input:s},fill_example)
exb_call(g,ci,"abstract_example",
{cat:cat,input:s,abstract:example[0]},
fill_example)
}
}
function by_example() {
var dir=local.get("dir")
if(dir) {
if(exb_output) {
exb_output.innerHTML="...";
exb_call(g,ci,"provide_example",
{lang:g.basename+conc.example_lang,
fun:fun,
grammar:"."+dir+"/"+g.basename+".pgf"},
show_example)
}
}
else exb_output.innerHTML="Compile the grammar first!"
}
function show_test(txt) {
exb_output.innerHTML="";
exb_output.appendChild(text(txt))
}
function test_it(b) {
if(exb_output) {
exb_output.innerHTML="...";
exb_call(g,ci,"test_function",{fun:fun},show_test)
}
}
var buttons=[];
if(conc.example_based && eb) {
if(eb.exready[fun])
buttons.push(button("By example",by_example))
if(eb.testable[fun]) {
var b=button("Test it",test_it);
buttons.push(b)
}
var exb_output=empty("span");
buttons.push(exb_output)
}
return buttons
}