0.0.10 • Published 7 years ago
transparent-lang v0.0.10
Transparent Lang
Small DSL for the transparent-tank project.
npm install transparent-lang
Usage:
transparent-lang supports:
- Expressions such as
height * width
- Boolean expression such as
shape = "square"
- Rules such as
area = height * width if shape = "square"
Expressions
s
// 1. Define your data
const variables = {
height: 4,
width: 5
};
const symboltable = {
lookup: key => variables[key],
restrict: () => {}
};
// 2. Deine your expression
let expression = new Expression( 'height * width', symboltable );
// 3. Evaluate the expression over your data
expression.eval(); // returns 20
Bool
s
// 1. Define your data
const variables = {
shape: 'square'
};
const symboltable = {
lookup: key => variables[key],
restrict: () => {}
};
// 2. Deine your expression
let expression = new Bool( 'shape = "square"', symboltable );
// 3. Evaluate the expression over your data
expression.eval(); // returns true
Rule
s
// 1. Define your data
const variables = {
shape: 'square'
height: 4,
width: 5,
area: null
};
const symboltable = {
lookup: key => variables[key],
restrict: (key, value) => variables[key] = value
};
// 2. Deine your expression
let rule = new Rule( 'area = height * width if shape = "square"', symboltable );
// 3. Evaluate the rule over your data
rule.eval(); // returns true
// OBS! variables.area is now 20
Grammar
Find a visual representation of the grammar here: Grammar.
rule ::= ( statement EOL )* statement? EOF
statement ::= binaryMExpression ( 'IF' bexpression )?
bexpression ::= bterm ( 'OR' bterm )*
bterm ::= bconstant | bunaryOp | bparenthesis | binaryBExpression
( 'AND' ( bconstant | bunaryOp | bparenthesis | binaryBExpression ) )*
binaryBExpression ::= bfactor equality bfactor
bfactor ::= bconstant
| bunaryOp
| identifier
| literal
binaryMExpression ::= mexpression equality mexpression
equality ::= '='
| '<>'
| '>'
| '>='
| '<'
| '<='
mexpression ::= mterm ( ( '+' | '-' ) mterm )*
mterm ::= mterm2 ( '^' mterm2 )*
mterm2 ::= mfactor ( ( '*' | '/' ) mfactor )*
mfactor ::= munaryexpression
| identifier
| literal
| '(' mexpression ')'
literal ::= number
| "'" name "'"
| '"' name '"'
| bconstant
bconstant ::= 'false'
| 'true'
munaryExpression ::= munaryOp '(' mfactor ')'
munaryOp ::= 'COS'
| 'SIN'
| 'TAN'
| 'EXP'
| 'LN'
| 'ABS'
| 'SQRT'
| 'LOG10'
| 'ARCSIN'
| 'ARCCOS'
| 'ARCTAN'
| 'CEIL'
| 'TRUNC'
| 'FLOOR'
| 'ROUND'
sign ::= '+' | '-'
number ::= [0-9]+ ( '.' [0-9]+ )?
identifier ::= name
name ::= [a-zA-Z_] [0-9a-zA-Z_]*