Fix expression parser to require parsing full string
This commit is contained in:
parent
1a46130b1d
commit
21e8d95f98
2 changed files with 27 additions and 15 deletions
|
@ -2,21 +2,29 @@ import { AsText, TextPiece } from "../words";
|
||||||
import { Expr } from "./expr";
|
import { Expr } from "./expr";
|
||||||
|
|
||||||
describe("expr", () => {
|
describe("expr", () => {
|
||||||
test.each([
|
describe("Expr does math", () => {
|
||||||
["1", "1"],
|
test.each([
|
||||||
["1 + 2", "3"],
|
["1", "1"],
|
||||||
["1 - 2", "-1"],
|
["1 + 2", "3"],
|
||||||
["1 * 2", "2"],
|
["1 - 2", "-1"],
|
||||||
["1 / 2", "0.5"],
|
["1 * 2", "2"],
|
||||||
["1 // 2", "0"],
|
["1 / 2", "0.5"],
|
||||||
// TODO: operator precedence
|
["1 // 2", "0"],
|
||||||
// TODO: parentheses
|
// TODO: operator precedence
|
||||||
// TODO; eror reporting
|
// TODO: parentheses
|
||||||
])("Expr does math: %s", (expression, result) => {
|
])("%s", (expression, result) => {
|
||||||
const actualResult = Expr({}, [{ text: expression }]);
|
const actualResult = Expr({}, [{ text: expression }]);
|
||||||
console.log(actualResult)
|
expect("error" in actualResult).toBeFalsy();
|
||||||
expect("error" in actualResult).toBeFalsy();
|
expect(AsText(actualResult as TextPiece)).toEqual(result);
|
||||||
expect(AsText(actualResult as TextPiece)).toEqual(result);
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO; error reporting
|
||||||
|
describe("Expr rejects invalid expressions", () => {
|
||||||
|
test.each([["1 $ 2"], ["1 1 + 2"], ["$ 1"]])("%s", (expression) => {
|
||||||
|
const actualResult = Expr({}, [{ text: expression }]);
|
||||||
|
expect("error" in actualResult).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: handle expr prefix
|
// TODO: handle expr prefix
|
||||||
|
|
|
@ -12,6 +12,10 @@ export function Expr({}, argv: TextPiece[]): ProcResult {
|
||||||
const parser = new ExpressionParser(expression);
|
const parser = new ExpressionParser(expression);
|
||||||
const result = parser.parseSubExpression(0);
|
const result = parser.parseSubExpression(0);
|
||||||
|
|
||||||
|
if(parser.pos != expression.length) {
|
||||||
|
return {error: "Couldn't parse full expression"}
|
||||||
|
}
|
||||||
|
|
||||||
if ("value" in result) {
|
if ("value" in result) {
|
||||||
return { text: String(result.value) };
|
return { text: String(result.value) };
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue