From 104bd272f9b54eb0fe0cd795c7f6427be7011e34 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Fri, 3 Feb 2023 04:39:45 +0530 Subject: [PATCH] feat: bru lang - simple parser --- packages/bruno-lang/package.json | 3 +- packages/bruno-lang/v2/src/index.js | 55 ++++++++++++++++++++++ packages/bruno-lang/v2/tests/index.spec.js | 17 +++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 packages/bruno-lang/v2/src/index.js create mode 100644 packages/bruno-lang/v2/tests/index.spec.js diff --git a/packages/bruno-lang/package.json b/packages/bruno-lang/package.json index c243c7980..632aed4c5 100644 --- a/packages/bruno-lang/package.json +++ b/packages/bruno-lang/package.json @@ -10,6 +10,7 @@ "test": "jest" }, "dependencies": { - "arcsecond": "^5.0.0" + "arcsecond": "^5.0.0", + "ohm-js": "^16.6.0" } } diff --git a/packages/bruno-lang/v2/src/index.js b/packages/bruno-lang/v2/src/index.js new file mode 100644 index 000000000..563cdcfc2 --- /dev/null +++ b/packages/bruno-lang/v2/src/index.js @@ -0,0 +1,55 @@ +const ohm = require("ohm-js"); + +const grammar = ohm.grammar(`Bru { + Headers = "headers" "{" PairList "}" + PairList = Pair ("," Pair)* + Pair = Key ":" Value + Key = identifier + Value = stringLiteral + identifier = alnum* + stringLiteral = letter* +}`); + +const sem = grammar.createSemantics().addAttribute('ast', { + Headers(_, _1, PairList, _2) { + return PairList.ast; + }, + PairList(pairs, _, rest) { + return [pairs.ast, ...rest.ast]; + }, + Pair(key, _, value) { + return { key: key.ast, value: value.ast }; + }, + Key(id) { + return id.sourceString; + }, + Value(str) { + return str.sourceString; + }, + identifier(id) { + return id.sourceString; + }, + stringLiteral(str) { + return str.sourceString; + }, + _iter(...elements) { + return elements.map(e => e.ast); + } +}); + +const input = `headers { + hello: world, + foo: bar +}`; + +const parser = (input) => { + const match = grammar.match(input); + + if(match.succeeded()) { + return sem(match).ast; + } else { + throw new Error(match.message); + } +} + +module.exports = parser; diff --git a/packages/bruno-lang/v2/tests/index.spec.js b/packages/bruno-lang/v2/tests/index.spec.js new file mode 100644 index 000000000..e2d701092 --- /dev/null +++ b/packages/bruno-lang/v2/tests/index.spec.js @@ -0,0 +1,17 @@ +const parser = require("../src/index"); + +describe("parser", () => { + it("should parse headers", () => { + const input = `headers { + hello: world, + foo: bar + }`; + + const expected = [ + { key: "hello", value: "world" }, + { key: "foo", value: "bar" } + ]; + + expect(parser(input)).toEqual(expected); + }); +});