grammar-composer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +387 -0
  3. package/dist/Exports.d.ts +1 -0
  4. package/dist/Exports.js +2 -0
  5. package/dist/Exports.js.map +1 -0
  6. package/dist/Grammar.d.ts +62 -0
  7. package/dist/Grammar.js +376 -0
  8. package/dist/Grammar.js.map +1 -0
  9. package/dist/GrammarComposer.d.ts +61 -0
  10. package/dist/GrammarComposer.js +383 -0
  11. package/dist/GrammarComposer.js.map +1 -0
  12. package/dist/Grammars/JsonGrammar.d.ts +16 -0
  13. package/dist/Grammars/JsonGrammar.js +74 -0
  14. package/dist/Grammars/JsonGrammar.js.map +1 -0
  15. package/dist/Grammars/XmlGrammar.d.ts +13 -0
  16. package/dist/Grammars/XmlGrammar.js +74 -0
  17. package/dist/Grammars/XmlGrammar.js.map +1 -0
  18. package/dist/ParserTest.d.ts +1 -0
  19. package/dist/ParserTest.js +37 -0
  20. package/dist/ParserTest.js.map +1 -0
  21. package/dist/Test.d.ts +1 -0
  22. package/dist/Test.js +74 -0
  23. package/dist/Test.js.map +1 -0
  24. package/dist/TestData.d.ts +5 -0
  25. package/dist/TestData.js +466 -0
  26. package/dist/TestData.js.map +1 -0
  27. package/dist/TopDownParser.d.ts +13 -0
  28. package/dist/TopDownParser.js +229 -0
  29. package/dist/TopDownParser.js.map +1 -0
  30. package/dist/data/TestData.d.ts +5 -0
  31. package/dist/data/TestData.js +466 -0
  32. package/dist/data/TestData.js.map +1 -0
  33. package/dist/test-data/TestData.d.ts +5 -0
  34. package/dist/test-data/TestData.js +466 -0
  35. package/dist/test-data/TestData.js.map +1 -0
  36. package/dist/test-grammars/JsonGrammar.d.ts +17 -0
  37. package/dist/test-grammars/JsonGrammar.js +74 -0
  38. package/dist/test-grammars/JsonGrammar.js.map +1 -0
  39. package/dist/test-grammars/XmlGrammar.d.ts +14 -0
  40. package/dist/test-grammars/XmlGrammar.js +74 -0
  41. package/dist/test-grammars/XmlGrammar.js.map +1 -0
  42. package/dist/utilities/Timer.d.ts +13 -0
  43. package/dist/utilities/Timer.js +70 -0
  44. package/dist/utilities/Timer.js.map +1 -0
  45. package/dist/utilities/utilities.d.ts +8 -0
  46. package/dist/utilities/utilities.js +26 -0
  47. package/dist/utilities/utilities.js.map +1 -0
  48. package/package.json +40 -0
  49. package/src/GrammarComposer.ts +541 -0
  50. package/src/Test.ts +101 -0
  51. package/src/TopDownParser.ts +304 -0
  52. package/src/test-data/TestData.ts +470 -0
  53. package/src/test-grammars/JsonGrammar.ts +118 -0
  54. package/src/test-grammars/XmlGrammar.ts +141 -0
  55. package/src/utilities/Timer.ts +95 -0
  56. package/src/utilities/Utilities.ts +33 -0
  57. package/tsconfig.json +105 -0
@@ -0,0 +1,13 @@
1
+ export declare class Timer {
2
+ startTime: number;
3
+ constructor();
4
+ restart(): void;
5
+ get elapsedTime(): number;
6
+ get elapsedTimeSeconds(): number;
7
+ getElapsedTimeAndRestart(): number;
8
+ logAndRestart(title: string, timePrecision?: number): number;
9
+ static get currentTime(): number;
10
+ static get microsecondTimestamp(): number;
11
+ private static createGlobalTimestampFunction;
12
+ private static timestampFunc;
13
+ }
@@ -0,0 +1,70 @@
1
+ import { roundToDigits } from "./Utilities.js";
2
+ export class Timer {
3
+ startTime = 0;
4
+ constructor() {
5
+ this.restart();
6
+ }
7
+ restart() {
8
+ this.startTime = Timer.currentTime;
9
+ }
10
+ get elapsedTime() {
11
+ // Elapsed time (milliseconds)
12
+ return Timer.currentTime - this.startTime;
13
+ }
14
+ get elapsedTimeSeconds() {
15
+ // Elapsed time (seconds)
16
+ return this.elapsedTime / 1000;
17
+ }
18
+ getElapsedTimeAndRestart() {
19
+ const elapsedTime = this.elapsedTime;
20
+ this.restart();
21
+ return elapsedTime;
22
+ }
23
+ logAndRestart(title, timePrecision = 3) {
24
+ const elapsedTime = this.elapsedTime;
25
+ //
26
+ const message = `${title}: ${roundToDigits(elapsedTime, timePrecision)}ms`;
27
+ console.log(message);
28
+ //
29
+ this.restart();
30
+ return elapsedTime;
31
+ }
32
+ static get currentTime() {
33
+ if (!this.timestampFunc) {
34
+ this.createGlobalTimestampFunction();
35
+ }
36
+ return this.timestampFunc();
37
+ }
38
+ static get microsecondTimestamp() {
39
+ return Math.floor(Timer.currentTime * 1000);
40
+ }
41
+ static createGlobalTimestampFunction() {
42
+ if (typeof process === 'object' && typeof process.hrtime === 'function') {
43
+ let baseTimestamp = 0;
44
+ this.timestampFunc = () => {
45
+ const nodeTimeStamp = process.hrtime();
46
+ const millisecondTime = (nodeTimeStamp[0] * 1000) + (nodeTimeStamp[1] / 1000000);
47
+ return baseTimestamp + millisecondTime;
48
+ };
49
+ baseTimestamp = Date.now() - this.timestampFunc();
50
+ }
51
+ else if (typeof chrome === 'object' && chrome.Interval) {
52
+ const baseTimestamp = Date.now();
53
+ const chromeIntervalObject = new chrome.Interval();
54
+ chromeIntervalObject.start();
55
+ this.timestampFunc = () => baseTimestamp + chromeIntervalObject.microseconds() / 1000;
56
+ }
57
+ else if (typeof performance === 'object' && performance.now) {
58
+ const baseTimestamp = Date.now() - performance.now();
59
+ this.timestampFunc = () => baseTimestamp + performance.now();
60
+ }
61
+ else if (Date.now) {
62
+ this.timestampFunc = () => Date.now();
63
+ }
64
+ else {
65
+ this.timestampFunc = () => (new Date()).getTime();
66
+ }
67
+ }
68
+ static timestampFunc;
69
+ }
70
+ //# sourceMappingURL=Timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timer.js","sourceRoot":"","sources":["../../src/utilities/Timer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function roundToDigits(val: number, digits?: number): number;
2
+ export declare function isNumber(value: any): value is number;
3
+ export declare function isString(value: any): value is string;
4
+ export declare function isBigInt(value: any): value is bigint;
5
+ export declare function isObject(value: any): value is object;
6
+ export declare function isArray(value: any): value is any[];
7
+ export declare function isBoolean(value: any): value is boolean;
8
+ export declare function isFunction(value: any): value is Function;
@@ -0,0 +1,26 @@
1
+ export function roundToDigits(val, digits = 3) {
2
+ const multiplier = 10 ** digits;
3
+ return Math.round(val * multiplier) / multiplier;
4
+ }
5
+ export function isNumber(value) {
6
+ return typeof value === 'number';
7
+ }
8
+ export function isString(value) {
9
+ return typeof value === 'string';
10
+ }
11
+ export function isBigInt(value) {
12
+ return typeof value === 'bigint';
13
+ }
14
+ export function isObject(value) {
15
+ return typeof value === 'object' && !Array.isArray(value);
16
+ }
17
+ export function isArray(value) {
18
+ return Array.isArray(value);
19
+ }
20
+ export function isBoolean(value) {
21
+ return typeof value === 'boolean';
22
+ }
23
+ export function isFunction(value) {
24
+ return typeof value === 'function';
25
+ }
26
+ //# sourceMappingURL=Utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../../src/utilities/Utilities.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;IACpD,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAA;IAE/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,UAAU,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAU;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAU;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAU;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAU;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAU;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAU;IACnC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAU;IACpC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAA;AACnC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "grammar-composer",
3
+ "version": "0.1.0",
4
+ "description": "Defines and generates parsers from composable grammar definitions. Includes advanced features like lexer-free parsing, selective packrat memoization and static analysis.",
5
+ "author": "Rotem Dan",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "grammar",
9
+ "context-free grammar",
10
+ "PEG",
11
+ "Parsing Expression Grammar",
12
+ "Parser generator",
13
+ "Lexer-free parsing"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/rotemdan/grammar-composer"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/rotemdan/grammar-composer/issues"
21
+ },
22
+ "main": "./dist/GrammarComposer.js",
23
+ "type": "module",
24
+ "files": [
25
+ "dist",
26
+ "src",
27
+ "tsconfig.json",
28
+ "LICENSE.md",
29
+ "README.md"
30
+ ],
31
+ "scripts": {
32
+ "test": "node dist/Test.js"
33
+ },
34
+ "dependencies": {
35
+ "regexp-composer": "^0.2.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.10.1"
39
+ }
40
+ }