Skip to content

Commit ffea254

Browse files
committed
feat: ignore redundant space chars
fix: docs
1 parent a546e52 commit ffea254

File tree

10 files changed

+49
-6
lines changed

10 files changed

+49
-6
lines changed

README.md

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@
22

33
This is a simple engine for parsing and interpreting expressions and rules.
44

5+
## Install
6+
7+
add dependency at `package.json`, then install
8+
9+
~~~json
10+
"dependencies": {
11+
"simple-expr-engine": "git+https://github.com/luo3house/simple-expr-engine"
12+
}
13+
~~~
14+
15+
~~~bash
16+
npm install
17+
# or if use yarn
18+
yarn
19+
~~~
20+
21+
### UMD
22+
23+
Directly use UMD with global variable `simple_expr_engine`:
24+
25+
[https://github.com/luo3house/simple-expr-engine/tree/master/dist/umd/index.min.js](https://github.com/luo3house/simple-expr-engine/tree/master/dist/umd/index.min.js)
26+
527
## Expression Grammar
628

729
It is described as a JavaScript-like language. But not all features as JavaScript.
@@ -125,9 +147,10 @@ const sources = [
125147
"( exp < 160 ) => 10",
126148
];
127149
try {
128-
const level = Interpreter.interpretRules(
150+
const result = Interpreter.interpretRules(
129151
Facade.buildRules(context, sources)
130-
); // 9
152+
);
153+
const level = result.valueHolder.asNumber() // 9
131154
} catch (e: NoRuleResultError) {
132155
// throw if no any rules matched
133156
}

__test__/interpret-rule.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ test('all constant values', () => {
1111
expect(Interpreter.interpretRules(rules).valueHolder.asNumber()).toBe(2022);
1212
});
1313

14+
test('empty expr', () => {
15+
const context = {
16+
variableStore: new VariableStore([]),
17+
};
18+
const source = ``;
19+
const rules = Facade.buildRules(context, [source]);
20+
expect(() => Interpreter.interpretRules(rules)).toThrow('no rule result');
21+
});
22+
1423
test('as variable', () => {
1524
const context = {
1625
variableStore: new VariableStore([

__test__/tokenizer.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { Token } from '../src/compiler/tokenizer';
2+
3+
test('should ignore redundant space chars', () => {
4+
const tokens = Token.recognizeAll(' ( age < 18 ) '.split(' '));
5+
expect(tokens.length).toBe(5);
6+
});

dist/cjs/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ var Token = /*#__PURE__*/function () {
570570
var tokens = [];
571571

572572
for (var i = 0; i < characters.length; i++) {
573+
if (!characters[i]) continue;
573574
tokens.push(Token.recognize(characters[i]));
574575
}
575576

@@ -1209,6 +1210,7 @@ var Facade = /*#__PURE__*/function () {
12091210
value: function buildRules(context, ruleSources) {
12101211
var rules = [];
12111212
ruleSources.forEach(function (ruleSource) {
1213+
if (!ruleSource) return;
12121214
var characters = Token.escapeStringCharacters(ruleSource.split(''));
12131215
rules.push(new RuleParser(context, Token.newReader(Token.recognizeAll(characters))).build());
12141216
});

dist/esm/compiler/facade.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export var Facade = /*#__PURE__*/function () {
1616
value: function buildRules(context, ruleSources) {
1717
var rules = [];
1818
ruleSources.forEach(function (ruleSource) {
19+
if (!ruleSource) return;
1920
var characters = Token.escapeStringCharacters(ruleSource.split(''));
2021
rules.push(new RuleParser(context, Token.newReader(Token.recognizeAll(characters))).build());
2122
});

dist/esm/compiler/tokenizer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export var Token = /*#__PURE__*/function () {
156156
var tokens = [];
157157

158158
for (var i = 0; i < characters.length; i++) {
159+
if (!characters[i]) continue;
159160
tokens.push(Token.recognize(characters[i]));
160161
}
161162

dist/umd/index.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@
3030
"rimraf": "^3.0.2",
3131
"rollup": "^2.78.0",
3232
"rollup-plugin-bundle-size": "^1.0.3",
33+
"rollup-plugin-terser": "^7.0.2",
3334
"ts-jest": "^28.0.5",
3435
"ts-node": "^10.8.2",
3536
"typescript": "^4.7.4"
3637
},
37-
"dependencies": {
38-
"rollup-plugin-terser": "^7.0.2"
39-
}
38+
"dependencies": {}
4039
}

src/compiler/facade.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export class Facade {
66
static buildRules(context: Context, ruleSources: string[]): Rule[] {
77
const rules: Rule[] = [];
88
ruleSources.forEach((ruleSource) => {
9+
if (!ruleSource) return;
910
const characters = Token.escapeStringCharacters(ruleSource.split(''));
1011
rules.push(new RuleParser(context, Token.newReader(Token.recognizeAll(characters))).build());
1112
});

src/compiler/tokenizer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export class Token {
6060
public static recognizeAll(characters: string[]): Token[] {
6161
const tokens: Token[] = [];
6262
for (let i = 0; i < characters.length; i++) {
63+
if (!characters[i]) continue;
6364
tokens.push(Token.recognize(characters[i]));
6465
}
6566
return tokens;

0 commit comments

Comments
 (0)