MediaWiki:Skin/Projekt:Adventure2/parser/raw: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
J* (Diskussion | Beiträge) (neue Features: multiple events; page-, item-deklarationen; kommentare; escaping.) |
K (Textersetzung - „kamelopedia.mormo.org“ durch „kamelopedia.net“) |
||
(21 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
* A2 event syntax parser using pegjs | * A2 event syntax parser using pegjs | ||
* http://pegjs.majda.cz/online | * http://pegjs.majda.cz/online | ||
+ | * | ||
+ | * Parser variable: a2.parser | ||
+ | * + Use results cache | ||
+ | * + Track line and column | ||
+ | * | ||
+ | * Put the results here: http://kamelopedia.net/index.php?title=MediaWiki:Skin/Projekt:Adventure2/parser.js&action=edit | ||
*/ | */ | ||
start | start | ||
− | = Declaration* | + | = S? d:Declaration* {return d;} |
Declaration | Declaration | ||
Zeile 19: | Zeile 25: | ||
co:ConditionClause? | co:ConditionClause? | ||
ac:ActionClause? | ac:ActionClause? | ||
− | End S? { return ["event", {name:n?n[1]:" | + | End S? { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; } |
TriggerClause | TriggerClause | ||
Zeile 29: | Zeile 35: | ||
TriggerFunction | TriggerFunction | ||
− | = t: | + | = t:TriggerPageOrVirtOp L a:(Page/PageVirtual) R {return t+"."+a;} |
− | / t: | + | / t:TriggerItemOrVirtOp L a:(Item/ItemVirtual) R {return t+"."+a;} |
− | / t: | + | / t:"click" L a:Identifier R {return t+"."+a;} |
+ | / t:"combine" L a:(Item/ItemVirtual) C b:(Item/ItemVirtual) R {return [t,a,b].join(".")} | ||
+ | / t:"apply" L a:(Item/ItemVirtual) C b:Identifier R {return [t,a,b].join(".")} | ||
− | + | TriggerPageOrVirtOp | |
= 'enter' | = 'enter' | ||
/ 'leave' | / 'leave' | ||
− | + | ||
− | + | TriggerItemOrVirtOp | |
= 'add' | = 'add' | ||
/ 'remove' | / 'remove' | ||
/ 'activate' | / 'activate' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
ConditionClause | ConditionClause | ||
Zeile 56: | Zeile 59: | ||
/ 'not' L f:ConditionFunction R {return function(){ return !f()};} | / 'not' L f:ConditionFunction R {return function(){ return !f()};} | ||
/ 'have' L i:Item R {return function(){return !!a2.items[i]};} | / 'have' L i:Item R {return function(){return !!a2.items[i]};} | ||
+ | / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};} | ||
+ | / 'have' L v:ItemVirtual R {return function(){return !!a2.util.hasVirtual(v);};} | ||
+ | / 'visible' L o:Overlay R {return function(){return $("#overlay_"+o+":visible").length;};} | ||
+ | / 'timeoutIsSet' L R {return function(){return a2.util.timeoutIsSet();};} | ||
ConditionArgs | ConditionArgs | ||
Zeile 65: | Zeile 72: | ||
ActionFunctions | ActionFunctions | ||
− | = f:ActionFunction C a:ActionFunctions {return function( | + | = f:ActionFunction C a:ActionFunctions {return function(real){f(real); a(real);};} |
− | / ActionFunction | + | / ActionFunction |
− | + | ||
ActionFunction | ActionFunction | ||
− | = f:'goto' L p:Page R {return function(){a2.util.goto(p)};} | + | = f:'goto' L p:Page R {return function(real){a2.util.goto(p)};} |
− | / f:'add' L i:Item R {return function(){a2.util.add(i)};} | + | / f:'add' L i:Item R {return function(real){a2.util.add(i)};} |
− | / f:'remove' L i:Item R {return function(){a2.util.remove(i)};} | + | / f:'remove' L i:Item R {return function(real){a2.util.remove(i)};} |
− | / f:'print' L s:String R {return function(){a2.util.print(s)};} | + | / f:'print' L s:String R {return function(real){a2.util.print(s)};} |
− | / f: | + | / f:"ask" L s:String C c:StringKwArgClause R {return function(real){a2.util.print(s,c);};} |
+ | / f:'clearTimeout' L R {return function(real){a2.timer.clear();};} | ||
+ | / f:'showOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).show();};} | ||
+ | / f:'hideOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).hide();};} | ||
+ | / f:'remove' L i:ItemVirtual R {return function(real){a2.util.removeAll(i)};} | ||
+ | / f:'remove' L '${' rt:(TriggerItemOrVirtOp / "combine" / "apply") rn:[12] '}' R {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};} | ||
+ | / "setTimeout" L t:Time R C a:ActionFunctions {return function(real){a2.timer.set(t, function(){a(real)});};} | ||
+ | / f:'play' L chan:Channel C file:String R {return function(real){a2.audio.play(chan, file)};} | ||
+ | / f:'stop' L chan:Channel R {return function(real){a2.audio.stop(chan)};} | ||
/* PAGES AND ITEMS */ | /* PAGES AND ITEMS */ | ||
+ | |||
+ | Channel | ||
+ | = "music" {return "music";} | ||
+ | / "noise" {return "noise";} | ||
+ | / "background" {return "background";} | ||
PageDec | PageDec | ||
Zeile 104: | Zeile 124: | ||
= v:ItemVirtual C vl:ItemVirtualList {vl.push(v); return vl;} | = v:ItemVirtual C vl:ItemVirtualList {vl.push(v); return vl;} | ||
/ v:ItemVirtual {return [v];} | / v:ItemVirtual {return [v];} | ||
+ | |||
+ | StringKwArgClause | ||
+ | = k:StringKwArg C r:StringKwArgClause {return [k].concat(r); } | ||
+ | / k:StringKwArg { return [k]; } | ||
+ | |||
+ | StringKwArg | ||
+ | = i:Identifier S? '=' S? s:String {return [i,s];} | ||
/* UTILITIES */ | /* UTILITIES */ | ||
Zeile 130: | Zeile 157: | ||
Page | Page | ||
= p:[0-9]+ {return p.join("");} | = p:[0-9]+ {return p.join("");} | ||
+ | |||
+ | Time | ||
+ | = p:[1-9] q:[0-9]* {return parseInt(p+q.join(""));} | ||
Item | Item | ||
= Identifier | = Identifier | ||
+ | |||
+ | Overlay | ||
+ | = p:[a-z]+ {return p.join("");} | ||
S | S | ||
− | = [ \t\n]* "/*" [^*]* "*/" S? | + | = [ \t\n]* "/*" ([^*] / [*][^/] )* "*/" S? |
− | / [ \t\n]* "//" [^\n]* | + | / [ \t\n]* "//" [^\n]* S? |
/ [ \t\n]+ | / [ \t\n]+ | ||
Aktuelle Version vom 31. Dezember 2013, 02:10 Uhr
/* * A2 event syntax parser using pegjs * http://pegjs.majda.cz/online * * Parser variable: a2.parser * + Use results cache * + Track line and column * * Put the results here: http://kamelopedia.net/index.php?title=MediaWiki:Skin/Projekt:Adventure2/parser.js&action=edit */ start = S? d:Declaration* {return d;}
Declaration = EventDec / PageDec / ItemDec
/* EVENTS */
EventDec = S? 'event' n:(S Identifier)? CC tr:TriggerClause co:ConditionClause? ac:ActionClause? End S? { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; } TriggerClause = 'on' S S? tr:TriggerFunctions CC {return tr;} TriggerFunctions = t:TriggerFunction C o:TriggerFunctions {o.push(t); return o;} / t:TriggerFunction {return [t];} TriggerFunction = t:TriggerPageOrVirtOp L a:(Page/PageVirtual) R {return t+"."+a;} / t:TriggerItemOrVirtOp L a:(Item/ItemVirtual) R {return t+"."+a;} / t:"click" L a:Identifier R {return t+"."+a;} / t:"combine" L a:(Item/ItemVirtual) C b:(Item/ItemVirtual) R {return [t,a,b].join(".")} / t:"apply" L a:(Item/ItemVirtual) C b:Identifier R {return [t,a,b].join(".")} TriggerPageOrVirtOp = 'enter' / 'leave'
TriggerItemOrVirtOp = 'add' / 'remove' / 'activate' ConditionClause = 'if' S co:ConditionFunction CC {return co;} ConditionFunction = 'page' L p:Page R {return function(){return a2.cpage == p};} / 'any' L a:ConditionArgs R {return function(){for(var j=0; j<a.length; j++) if (a[j]()) return true; return false; }} / 'all' L a:ConditionArgs R {return function(){for(var j=0; j<a.length; j++) if (!a[j]()) return false; return true; }} / 'not' L f:ConditionFunction R {return function(){ return !f()};} / 'have' L i:Item R {return function(){return !!a2.items[i]};} / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};} / 'have' L v:ItemVirtual R {return function(){return !!a2.util.hasVirtual(v);};} / 'visible' L o:Overlay R {return function(){return $("#overlay_"+o+":visible").length;};} / 'timeoutIsSet' L R {return function(){return a2.util.timeoutIsSet();};} ConditionArgs = f:ConditionFunction C a:ConditionArgs {a.push(f); return a;} / f:ConditionFunction {return [f];} ActionClause = 'do' S ac:ActionFunctions CC {return ac;} ActionFunctions = f:ActionFunction C a:ActionFunctions {return function(real){f(real); a(real);};} / ActionFunction
ActionFunction = f:'goto' L p:Page R {return function(real){a2.util.goto(p)};} / f:'add' L i:Item R {return function(real){a2.util.add(i)};} / f:'remove' L i:Item R {return function(real){a2.util.remove(i)};} / f:'print' L s:String R {return function(real){a2.util.print(s)};} / f:"ask" L s:String C c:StringKwArgClause R {return function(real){a2.util.print(s,c);};} / f:'clearTimeout' L R {return function(real){a2.timer.clear();};} / f:'showOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).show();};} / f:'hideOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).hide();};} / f:'remove' L i:ItemVirtual R {return function(real){a2.util.removeAll(i)};} / f:'remove' L '${' rt:(TriggerItemOrVirtOp / "combine" / "apply") rn:[12] '}' R {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};} / "setTimeout" L t:Time R C a:ActionFunctions {return function(real){a2.timer.set(t, function(){a(real)});};} / f:'play' L chan:Channel C file:String R {return function(real){a2.audio.play(chan, file)};} / f:'stop' L chan:Channel R {return function(real){a2.audio.stop(chan)};}
/* PAGES AND ITEMS */
Channel = "music" {return "music";} / "noise" {return "noise";} / "background" {return "background";}
PageDec = "page" CC pv:PageVirtualClause? End {return ["page", {virt:pv}];}
PageVirtualClause = "provides" S v:PageVirtualList CC {return v;}
PageVirtualList = v:PageVirtual C vl:PageVirtualList {vl.push(v); return vl;} / v:PageVirtual {return [v];}
ItemDec = "item" CC t:TitleClause? iv:ItemVirtualClause? End {return ["item", {virt:iv, title:t}];}
TitleClause = "title" S s:String CC {return s;}
ItemVirtualClause = "provides" S v:ItemVirtualList CC {return v;}
ItemVirtualList = v:ItemVirtual C vl:ItemVirtualList {vl.push(v); return vl;} / v:ItemVirtual {return [v];}
StringKwArgClause = k:StringKwArg C r:StringKwArgClause {return [k].concat(r); } / k:StringKwArg { return [k]; }
StringKwArg = i:Identifier S? '=' S? s:String {return [i,s];}
/* UTILITIES */ L = S? '(' S? R = S? ')' S? C = S? ',' S? CC = S? ';' S? Identifier = i1:[a-zäöü_] i2:[a-zäöü_]* {return i1+i2.join("");} PageVirtual = p:"@" i:Identifier {return p+i;}
ItemVirtual = p:":" i:Identifier {return p+i;}
Page = p:[0-9]+ {return p.join("");}
Time = p:[1-9] q:[0-9]* {return parseInt(p+q.join(""));} Item = Identifier
Overlay = p:[a-z]+ {return p.join("");} S = [ \t\n]* "/*" ([^*] / [*][^/] )* "*/" S? / [ \t\n]* "//" [^\n]* S? / [ \t\n]+ String = "'" s:SingleStringChar* "'" { return s.join("");} / '"' s:DoubleStringChar* '"' { return s.join("");}
SingleStringChar = EscapeSequence / [^']
DoubleStringChar = EscapeSequence / [^"]
EscapeSequence = "\\n" {return "\n";} / "\\\"" {return '"';} / "\\\'" {return "'";}
End = "end" S? "." S?