Skip to content

Commit

Permalink
feat: Support 'or' and 'and' operators
Browse files Browse the repository at this point in the history
  • Loading branch information
kantord committed Oct 13, 2018
1 parent d0bf77b commit ea8356d
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 1 deletion.
4 changes: 4 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ Usage example:

`3 + 1 == 4 * 1`

The following Python-style operators are also available as an alternative:

`or`, `and`

#### Identity `$`

Takes an input and returns it unchanged.
Expand Down
276 changes: 276 additions & 0 deletions src/__tests__/__snapshots__/interpreter.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ exports[`interpreter correct target code !(3 * .foo -1 > -1.34 * .bar) && true 1

exports[`interpreter correct target code !(3 * 2 -1 > -1.34 * 3) && true 1`] = `"(function(_) { return (function(input) { return (!((3*2-1>-1.34*3)))&&true})})"`;

exports[`interpreter correct target code !(3 * 2 -1 > -1.34 * 3) and true 1`] = `"(function(_) { return (function(input) { return (!((3*2-1>-1.34*3)))&&true})})"`;

exports[`interpreter correct target code "1" == 1 1`] = `"(function(_) { return (function(input) { return \\"1\\"===1})})"`;

exports[`interpreter correct target code $ 1`] = `"(function(_) { return (function(input) { return input})})"`;
Expand Down Expand Up @@ -75,6 +77,8 @@ exports[`interpreter correct target code 3 * 2 -1 > -1.34 * 3 || true 1`] = `"(f

exports[`interpreter correct target code 3 * 2 -1 > -1.34 * 3 1`] = `"(function(_) { return (function(input) { return 3*2-1>-1.34*3})})"`;

exports[`interpreter correct target code 3 * 2 -1 > -1.34 * 3 or true 1`] = `"(function(_) { return (function(input) { return 3*2-1>-1.34*3||true})})"`;

exports[`interpreter correct target code 3 * 2 -1 >= -1.34 * 3 1`] = `"(function(_) { return (function(input) { return 3*2-1>=-1.34*3})})"`;

exports[`interpreter correct target code 8 * 3.14 / 2 1`] = `"(function(_) { return (function(input) { return 8*3.14/2})})"`;
Expand Down Expand Up @@ -399,6 +403,153 @@ Object {
}
`;

exports[`interpreter correct target tree !(3 * 2 -1 > -1.34 * 3) and true 1`] = `
Object {
"status": true,
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "unaryOperation",
"value": Object {
"operand": Object {
"name": "parentheses",
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "3",
},
Object {
"end": Object {
"column": 7,
"line": 1,
"offset": 6,
},
"name": "primitive",
"start": Object {
"column": 4,
"line": 1,
"offset": 3,
},
"value": "*",
},
Object {
"name": "primitive",
"value": "2",
},
],
},
Object {
"end": Object {
"column": 10,
"line": 1,
"offset": 9,
},
"name": "primitive",
"start": Object {
"column": 8,
"line": 1,
"offset": 7,
},
"value": "-",
},
Object {
"name": "primitive",
"value": "1",
},
],
},
Object {
"end": Object {
"column": 14,
"line": 1,
"offset": 13,
},
"name": "primitive",
"start": Object {
"column": 11,
"line": 1,
"offset": 10,
},
"value": ">",
},
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "-1.34",
},
Object {
"end": Object {
"column": 22,
"line": 1,
"offset": 21,
},
"name": "primitive",
"start": Object {
"column": 19,
"line": 1,
"offset": 18,
},
"value": "*",
},
Object {
"name": "primitive",
"value": "3",
},
],
},
],
},
},
"operator": Object {
"end": Object {
"column": 2,
"line": 1,
"offset": 1,
},
"name": "primitive",
"start": Object {
"column": 1,
"line": 1,
"offset": 0,
},
"value": "!",
},
},
},
Object {
"end": Object {
"column": 29,
"line": 1,
"offset": 28,
},
"name": "primitive",
"start": Object {
"column": 24,
"line": 1,
"offset": 23,
},
"value": "&&",
},
Object {
"name": "primitive",
"value": "true",
},
],
},
}
`;

exports[`interpreter correct target tree "1" == 1 1`] = `
Object {
"status": true,
Expand Down Expand Up @@ -2901,6 +3052,131 @@ Object {
}
`;

exports[`interpreter correct target tree 3 * 2 -1 > -1.34 * 3 or true 1`] = `
Object {
"status": true,
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "3",
},
Object {
"end": Object {
"column": 5,
"line": 1,
"offset": 4,
},
"name": "primitive",
"start": Object {
"column": 2,
"line": 1,
"offset": 1,
},
"value": "*",
},
Object {
"name": "primitive",
"value": "2",
},
],
},
Object {
"end": Object {
"column": 8,
"line": 1,
"offset": 7,
},
"name": "primitive",
"start": Object {
"column": 6,
"line": 1,
"offset": 5,
},
"value": "-",
},
Object {
"name": "primitive",
"value": "1",
},
],
},
Object {
"end": Object {
"column": 12,
"line": 1,
"offset": 11,
},
"name": "primitive",
"start": Object {
"column": 9,
"line": 1,
"offset": 8,
},
"value": ">",
},
Object {
"name": "binaryOperation",
"value": Array [
Object {
"name": "primitive",
"value": "-1.34",
},
Object {
"end": Object {
"column": 20,
"line": 1,
"offset": 19,
},
"name": "primitive",
"start": Object {
"column": 17,
"line": 1,
"offset": 16,
},
"value": "*",
},
Object {
"name": "primitive",
"value": "3",
},
],
},
],
},
Object {
"end": Object {
"column": 25,
"line": 1,
"offset": 24,
},
"name": "primitive",
"start": Object {
"column": 21,
"line": 1,
"offset": 20,
},
"value": "||",
},
Object {
"name": "primitive",
"value": "true",
},
],
},
}
`;

exports[`interpreter correct target tree 3 * 2 -1 >= -1.34 * 3 1`] = `
Object {
"status": true,
Expand Down
8 changes: 8 additions & 0 deletions src/__tests__/interpreter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,14 @@ const tests = [
{ name: 'Franz', age: 8 }
],
output: ['Mary', 'Gabe']
},
{
sourceCode: `3 * 2 -1 > -1.34 * 3 or true`,
output: 3 * 2 - 1 > -1.34 * 3 || true
},
{
sourceCode: `!(3 * 2 -1 > -1.34 * 3) and true`,
output: !(3 * 2 - 1 > -1.34 * 3) && true
}
]

Expand Down
7 changes: 6 additions & 1 deletion src/parsers/boolean3.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,9 @@ import P from 'parsimmon'
import Boolean2 from './boolean2'
import BinaryOperatorParser from './abstract/binaryOperator'

export default BinaryOperatorParser(Boolean2, P.regexp(/(\|\||&&)/))
export default BinaryOperatorParser(
Boolean2,
P.regexp(/(\|\||&&|or|and)/).map(
(x: string): string => (x === 'or' ? '||' : x === 'and' ? '&&' : x)
)
)

0 comments on commit ea8356d

Please sign in to comment.