patrisika
v0.26.0
Published
An AST library
Downloads
1,787
Readme
Patrisika [Revented]
An library converts orthogonal AST into SpiderMonkey AST.
Semantics
AST for Patrisika is provided as JavaScript arraies. The following forms represents a node:
'identifier'
Represents a variable.
['.quote', value]
Represents a literal value.
['.unit']
Represents undefined value.
['.thisp']
Represents this reference.
['.argsp']
Represents argument list passed into the current function.
['.lambda', [...params], body]
Defines an anonymous function.
['.list', ...items]
Represents an array.
['.hash', ...['propName', propValue]]
Represents an object.
['.', base, member]
Represents a membering operation, i.e. base[member].
['.if', condition, consequent, alternate?]
Represents a conditional evaluation.
['.while', condition, body]
Represents a while loop evaluation. It returns the value of body in the last evaluation.
['.begin', ...items]
Represents a sequencial evaluation. Returns the last item evaluated.
['.return', value]
Return a value. Similar to JavaScript return statement.
['.try', block, [param], handler]
Represents a exception handling expression. Returns the value of block normally, or the value of handler1 when a exception is thrown during evaluating block.
['.throw', value]
Throws value as an exception.
['.set', left, right]
Assign right to variable or property node left.
[fn, ...args]
Once fn is a valid node, it means a common function invocation.
['.new', callee, ...args]
Initiates an instance of constructor callee, with args as arguments.
['.yield', value]
Represents a ES6 yield expression. Any functions directly containing such node will become a generator function described in ES6 specification.
['.beta', [...params], body, ...args]
Represents a beta redex which is similar to [['.lambda', [...params], body], ...args], used to implement semantics of let in scheme.
Operators
- Unary operator
['.typeof', x]:typeof['!', x]:!['+', x]:+['-', x]:-
- Binary and Logical operator
['+', x, y]:+(both numeric and string)['-', x, y]:-['*', x, y]:*['/', x, y]:/['%', x, y]:%['<', x, y]:<['>', x, y]:>['<=', x, y]:<=['>=', x, y]:>=['===', x, y]:===['!==', x, y]:!==['=~', x, y]:==['!~', x, y]:!=['.is', x, y]:instanceof['&&', x, y]:&&['||', x, y]:||
Usage
Using Patrisika is pretty simple and straight forward:
// Note : global scopes must be provided. Undeclared variables in Patrisika
// are treated as local variables, instead of global.
var globalScope = new Patrisika.DefaultExterns;
globalScope.declare("globalVariable");
patrisika.compile(ast, globals);