Skip to content

Instantly share code, notes, and snippets.

@mikeringrose
Created September 22, 2021 03:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikeringrose/48357604c52c34e0eef24131543d7642 to your computer and use it in GitHub Desktop.
Save mikeringrose/48357604c52c34e0eef24131543d7642 to your computer and use it in GitHub Desktop.
Boolean Expressions
Start
= _* node:Node+
{
return node[0];
}
/ _*
{
return {};
}
/ EOF
{
return {};
}
Node
= operator:Op_Expr EOF
{
return { operator };
}
/ operator:Op_Expr right:Node
{
return right;
}
/ left:Expr operator:Op_Expr* right:Node*
{
const node= { left };
right = (right.length == 0)
? null
: right[0]["right"] == null
? right[0]["left"]
: right[0];
if (right != null)
{
node["operator"] = (operator == "" || operator == undefined) ? "<implicit>" : operator[0];
node["right"] = right;
}
return node;
}
Expr
= field_exp:Unparen_Expr _*
{
return field_exp;
}
/ Paren_Expr
Paren_Expr
= "(" node:Node+ ")" _*
{
return node[0];
}
Unparen_Expr
= node:Paren_Expr
{
return node;
}
/ term:Term
{
return term;
}
Term
= term:Quoted_Term _*
{
return { term };
}
/ term:Unquoted_Term _*
{
return { term };
}
Unquoted_Term
= term:[^: \t\r\n\f\{\}()"+-/^~\[\]]+
{
var res = term.join('');
if (/^(?:AND|OR|NOT)$/.test(res)) {
var e = new Error('Term can not be AND, OR, NOT')
e.name = 'SyntaxError'
e.column = location
throw e
}
return res
}
Quoted_Term
= "\"" term:[^"]+ "\""
{
return term.join("")
}
Op_Expr
= _* operator:Op _+
{
return operator;
}
/ _* operator:Op EOF
{
return operator;
}
Op
= And
/ Or
/ Not
And
= "AND"
Or
= "OR"
Not
= "NOT"
_ "whitespace"
= [ \t\r\n\f]+
EOF
= !.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment