mirror of
https://github.com/NuSkooler/enigma-bbs.git
synced 2025-07-24 03:30:40 +02:00
* Very early start on PEG.js based ACS grammar
This commit is contained in:
parent
e023d0236e
commit
23025ca5bd
2 changed files with 924 additions and 0 deletions
72
misc/acs_parser.pegjs
Normal file
72
misc/acs_parser.pegjs
Normal file
|
@ -0,0 +1,72 @@
|
|||
|
||||
{
|
||||
var user = options.user;
|
||||
|
||||
function checkAcs(name, value) {
|
||||
return {
|
||||
ID : function userId(value) {
|
||||
return user.userId === value;
|
||||
}
|
||||
}[name](value) || false;
|
||||
}
|
||||
|
||||
function check(name, value) {
|
||||
// Dummy implementation: returns true when the name starts with 'A'
|
||||
return name.charAt(0) == 'A';
|
||||
}
|
||||
}
|
||||
|
||||
start
|
||||
= expr
|
||||
|
||||
expr
|
||||
= or_expr
|
||||
|
||||
or_expr
|
||||
= left:and_expr '|' right:expr { return left || right; }
|
||||
/ and_expr
|
||||
|
||||
and_expr
|
||||
= left:not_expr '&'? right:expr { return left && right; }
|
||||
/ not_expr
|
||||
|
||||
not_expr
|
||||
= '!' value:atom { return !value; }
|
||||
/ atom
|
||||
|
||||
atom
|
||||
= acs_check
|
||||
/ '(' value:expr ')' { return value; }
|
||||
|
||||
comma = ','
|
||||
ws = ' '
|
||||
|
||||
optionalSpc = ws*
|
||||
|
||||
acs_check
|
||||
= n:name a:arg { return checkAcs(n, a); }
|
||||
|
||||
name
|
||||
= c:([A-Z][A-Z]) { return c.join(''); }
|
||||
|
||||
argNum
|
||||
= c:[A-Za-z]+ { return c.join('') }
|
||||
|
||||
argVar
|
||||
= a:[A-Za-z0-9\-]+ { return a.join('') }
|
||||
|
||||
commaList
|
||||
= start:(v:argVar comma { return v; })* last:argVar { return start.concat(last); }
|
||||
|
||||
allList
|
||||
= '{' l:commaList '}' { return l; }
|
||||
|
||||
anyList
|
||||
= '[' l:commaList ']' { return l; }
|
||||
|
||||
arg
|
||||
= allList
|
||||
/ anyList
|
||||
/ c:[A-Za-z]+ { return c.join(''); }
|
||||
/ d:[0-9]* { return d ? parseInt(d.join(''), 10) : null; }
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue