Added not operator to the parser
This commit is contained in:
@@ -13,6 +13,7 @@ function id(x) { return x[0]; }
|
||||
import RollNode from '/imports/parser/parseTree/RollNode.js';
|
||||
import SymbolNode from '/imports/parser/parseTree/SymbolNode.js';
|
||||
import UnaryOperatorNode from '/imports/parser/parseTree/UnaryOperatorNode.js';
|
||||
import NotOperatorNode from '/imports/parser/parseTree/NotOperatorNode.js';
|
||||
|
||||
import moo from 'moo';
|
||||
|
||||
@@ -37,6 +38,7 @@ function id(x) { return x[0]; }
|
||||
ternaryOperator: ['?', ':'],
|
||||
multiplicativeOperator: ['*', '/'],
|
||||
exponentOperator: ['^'],
|
||||
notOperator: ['!'],
|
||||
additiveOperator: ['+', '-'],
|
||||
andOperator: ['&', '&&'],
|
||||
orOperator: ['|', '||'],
|
||||
@@ -81,7 +83,9 @@ let ParserRules = [
|
||||
{"name": "exponentExpression", "symbols": ["callExpression", "_", (lexer.has("exponentOperator") ? {type: "exponentOperator"} : exponentOperator), "_", "exponentExpression"], "postprocess": d => operator(d, 'exponent')},
|
||||
{"name": "exponentExpression", "symbols": ["unaryExpression"], "postprocess": id},
|
||||
{"name": "unaryExpression", "symbols": [(lexer.has("additiveOperator") ? {type: "additiveOperator"} : additiveOperator), "_", "unaryExpression"], "postprocess": d => new UnaryOperatorNode({operator: d[0].value, right: d[2]})},
|
||||
{"name": "unaryExpression", "symbols": ["callExpression"], "postprocess": id},
|
||||
{"name": "unaryExpression", "symbols": ["notExpression"], "postprocess": id},
|
||||
{"name": "notExpression", "symbols": [(lexer.has("notOperator") ? {type: "notOperator"} : notOperator), "_", "notExpression"], "postprocess": d => new NotOperatorNode({right: d[2]})},
|
||||
{"name": "notExpression", "symbols": ["callExpression"], "postprocess": id},
|
||||
{"name": "callExpression", "symbols": ["name", "_", "arguments"], "postprocess":
|
||||
d => new CallNode ({functionName: d[0].name, args: d[2]})
|
||||
},
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
import RollNode from '/imports/parser/parseTree/RollNode.js';
|
||||
import SymbolNode from '/imports/parser/parseTree/SymbolNode.js';
|
||||
import UnaryOperatorNode from '/imports/parser/parseTree/UnaryOperatorNode.js';
|
||||
import NotOperatorNode from '/imports/parser/parseTree/NotOperatorNode.js';
|
||||
|
||||
import moo from 'moo';
|
||||
|
||||
@@ -35,6 +36,7 @@
|
||||
ternaryOperator: ['?', ':'],
|
||||
multiplicativeOperator: ['*', '/'],
|
||||
exponentOperator: ['^'],
|
||||
notOperator: ['!'],
|
||||
additiveOperator: ['+', '-'],
|
||||
andOperator: ['&', '&&'],
|
||||
orOperator: ['|', '||'],
|
||||
@@ -105,6 +107,10 @@ exponentExpression ->
|
||||
|
||||
unaryExpression ->
|
||||
%additiveOperator _ unaryExpression {% d => new UnaryOperatorNode({operator: d[0].value, right: d[2]})%}
|
||||
| notExpression {% id %}
|
||||
|
||||
notExpression ->
|
||||
%notOperator _ notExpression {% d => new NotOperatorNode({right: d[2]})%}
|
||||
| callExpression {% id %}
|
||||
|
||||
callExpression ->
|
||||
|
||||
27
app/imports/parser/parseTree/NotOperatorNode.js
Normal file
27
app/imports/parser/parseTree/NotOperatorNode.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import ParseNode from '/imports/parser/parseTree/ParseNode.js';
|
||||
import ConstantNode from '/imports/parser/parseTree/ConstantNode.js';
|
||||
|
||||
export default class NotOperatorNode extends ParseNode {
|
||||
constructor({right}) {
|
||||
super(...arguments);
|
||||
this.right = right;
|
||||
}
|
||||
resolve(fn, scope, context){
|
||||
let rightNode = this.right[fn](scope, context);
|
||||
if (!(rightNode instanceof ConstantNode)){
|
||||
return new NotOperatorNode({
|
||||
right: rightNode,
|
||||
});
|
||||
}
|
||||
let right = rightNode.value;
|
||||
let result = !right;
|
||||
return new ConstantNode({
|
||||
value: result,
|
||||
type: typeof result,
|
||||
});
|
||||
}
|
||||
toString(){
|
||||
let {right} = this;
|
||||
return `!${right.toString()}`;
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ export default class OperatorNode extends ParseNode {
|
||||
let leftNode = this.left[fn](scope, context);
|
||||
let rightNode = this.right[fn](scope, context);
|
||||
let left, right;
|
||||
if (leftNode.type !== 'number' || rightNode.type !== 'number'){
|
||||
if (!(leftNode instanceof ConstantNode) || !(rightNode instanceof ConstantNode)){
|
||||
return new OperatorNode({
|
||||
left: leftNode,
|
||||
right: rightNode,
|
||||
|
||||
Reference in New Issue
Block a user