MediaWiki:Skin/Projekt:Adventure2/parser/raw: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
J* (Diskussion | Beiträge) mal sehen, ob's klappt |
K Textersetzung - „kamelopedia.mormo.org“ durch „kamelopedia.net“ |
||
| (13 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 | |||
*/ | */ | ||
| Zeile 53: | 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.hasVirtual(v);};} | / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};} | ||
/ 'have' L v:ItemVirtual R {return function(){return !!a2.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 64: | Zeile 72: | ||
ActionFunctions | ActionFunctions | ||
= f:ActionFunction C a:ActionFunctions {return function(real){ | = f:ActionFunction C a:ActionFunctions {return function(real){f(real); a(real);};} | ||
/ ActionFunction | / ActionFunction | ||
ActionFunction | ActionFunction | ||
= f:'goto' L p:Page R {return function(real){a2.util.goto(p)};} | = f:'goto' L p:Page R {return function(real){a2.util.goto(p)};} | ||
| Zeile 72: | Zeile 80: | ||
/ f:'remove' L i:Item R {return function(real){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(real){a2.util.print(s)};} | / 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 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][rn]) a2.util.remove(real[rn]);};} | / 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?