]>
git.kianting.info Git - clo/blob - src/index.js
2 var __createBinding
= (this && this.__createBinding
) || (Object
.create
? (function(o
, m
, k
, k2
) {
3 if (k2
=== undefined) k2
= k
;
4 var desc
= Object
.getOwnPropertyDescriptor(m
, k
);
5 if (!desc
|| ("get" in desc
? !m
.__esModule
: desc
.writable
|| desc
.configurable
)) {
6 desc
= { enumerable
: true, get: function() { return m
[k
]; } };
8 Object
.defineProperty(o
, k2
, desc
);
9 }) : (function(o
, m
, k
, k2
) {
10 if (k2
=== undefined) k2
= k
;
13 var __setModuleDefault
= (this && this.__setModuleDefault
) || (Object
.create
? (function(o
, v
) {
14 Object
.defineProperty(o
, "default", { enumerable
: true, value
: v
});
18 var __importStar
= (this && this.__importStar
) || function (mod
) {
19 if (mod
&& mod
.__esModule
) return mod
;
21 if (mod
!= null) for (var k
in mod
) if (k
!== "default" && Object
.prototype.hasOwnProperty
.call(mod
, k
)) __createBinding(result
, mod
, k
);
22 __setModuleDefault(result
, mod
);
25 Object
.defineProperty(exports
, "__esModule", { value
: true });
26 exports
.tkTreeToSExp
= void 0;
27 var fs
= require('fs');
28 const util
= __importStar(require("util"));
29 const p
= __importStar(require("typescript-parsec"));
35 * convert a `tkTree` AST to S-expr string
36 * @param t the `tkTree`
37 * @returns S-expr String
39 function tkTreeToSExp(t
) {
41 if (Array
.isArray(t
)) {
42 let strArray
= t
.map((x
) => tkTreeToSExp(x
));
43 str
= "(" + strArray
.join(" ") + ")";
46 if (t
=== undefined) {
55 exports
.tkTreeToSExp
= tkTreeToSExp
;
56 /**inspect the inner of the representation. */
57 let repr
= (x
) => { return util
.inspect(x
, { depth
: null }); };
59 (function (TokenKind
) {
60 TokenKind
[TokenKind
["Seperator"] = 0] = "Seperator";
61 TokenKind
[TokenKind
["Semicolon"] = 1] = "Semicolon";
62 TokenKind
[TokenKind
["Number"] = 2] = "Number";
63 TokenKind
[TokenKind
["Op"] = 3] = "Op";
64 TokenKind
[TokenKind
["ExprMark"] = 4] = "ExprMark";
65 TokenKind
[TokenKind
["Paren"] = 5] = "Paren";
66 TokenKind
[TokenKind
["SpaceNL"] = 6] = "SpaceNL";
67 TokenKind
[TokenKind
["Id"] = 7] = "Id";
68 TokenKind
[TokenKind
["Str"] = 8] = "Str";
69 })(TokenKind
|| (TokenKind
= {}));
73 const lexer
= p
.buildLexer([
74 [true, /^\d+(\.\d+)?/g, TokenKind
.Number
],
75 [true, /^\;/g, TokenKind
.Semicolon
],
76 [true, /^[-][-][-]/g, TokenKind
.Seperator
],
77 [true, /^[\+\-\*\/\&\|\!\^\<\>\~\=\?]+/g, TokenKind
.Op
],
78 [true, /^\@+/g, TokenKind
.ExprMark
],
79 [true, /^[()\[\]{}]/g, TokenKind
.Paren
],
80 [true, /^["]([\"]|[\\].)*["]/g, TokenKind
.Str
],
81 [true, /^[']([\']|[\\].)*[']/g, TokenKind
.Str
],
82 [true, /^[()\[\]{}]/g, TokenKind
.Paren
],
83 [true, /^[^\s\n\t\r;]+/g, TokenKind
.Id
],
84 [false, /^(\s|\n|\r|\t)+/g, TokenKind
.SpaceNL
]
90 const inputTxt
= `import ast;
93 const PROG
= p
.rule();
94 const UNIT
= p
.rule();
95 const IMPORTS
= p
.rule();
96 const SEMICOLON
= p
.rule();
97 let doubleMinus
= { type
: 'Punctuator', value
: '--' };
98 let doubleMinus2
= p
.str('--');
99 const TERM
= p
.rule();
100 function applyUnit(value
) {
103 function applySemiColon(value
) {
106 function applyParts(first
, second
) {
107 return ["%clo", first
, second
[1]];
109 PROG
.setPattern(p
.lrec_sc(IMPORTS
, p
.seq(p
.str('---'), UNIT
), applyParts
));
110 function applyImports(input
) {
111 let importTail
= input
[1].map(x
=> x
.text
);
112 return ["import"].concat(importTail
);
115 IMPORTS
.setPattern(p
.apply(p
.seq(p
.str('import'), p
.rep_sc(p
.tok(TokenKind
.Id
)), SEMICOLON
), applyImports
));
116 SEMICOLON
.setPattern(p
.apply(p
.tok(TokenKind
.Semicolon
), applySemiColon
));
117 UNIT
.setPattern(p
.apply(p
.tok(TokenKind
.Number
), applyUnit
));
118 let tree
= p
.expectSingleResult(p
.expectEOF(PROG
.parse(lexer
.parse(inputTxt
))));
119 console
.log("RESULT=" + tkTreeToSExp(tree
));