]>
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
.OnceOrMoreDo
= exports
.matchAny
= exports
.m1TType
= exports
.tkTreeToSExp
= void 0;
27 var fs
= require('fs');
28 const node_process_1
= require("node:process");
29 const tk
= __importStar(require("./tokenize.js"));
30 const util
= __importStar(require("util"));
34 let repr
= (x
) => { return util
.inspect(x
, { depth
: null }); };
36 * concated 2 `tkTree`s
37 * @param x the array to be concated
38 * @param y the item or array to ve concated
39 * @returns concated tkTree array, or thrown error if can't be concated.
41 function concat(x
, y
) {
42 if (Array
.isArray(x
)) {
46 throw new Error("the tkTree can't be concated, because it's not an array.");
49 function slice(x
, index
, end
) {
50 if (Array
.isArray(x
)) {
51 return x
.slice(index
, end
);
54 throw new Error("the tkTree can't be concated, because it's not an array.");
58 * convert a `tkTree` AST to S-expr string
59 * @param t the `tkTree`
60 * @returns S-expr String
62 function tkTreeToSExp(t
) {
64 if (Array
.isArray(t
)) {
65 let strArray
= t
.map((x
) => tkTreeToSExp(x
));
66 str
= "(" + strArray
.join(" ") + ")";
69 if (t
=== undefined) {
78 exports
.tkTreeToSExp
= tkTreeToSExp
;
81 * match one token type.
83 * it returns a function which test if the type of first token of the `remained` part of
84 * the argument of the function is `typ` , if it's true, update the `TokenMatcheePair` wrapped
85 * in `Some`. Otherwise, it returns `None`.
86 * * @param typ : the type to be test.
87 * @returns the updated `TokenMatcheePair` wrapped in `Some(x)` or `None`.
89 function m1TType(typ
) {
91 if (m
.remained
.length
== 0) {
92 return { _tag
: "None" };
97 const ttbm
= m
.remained
[0];
98 if (ttbm
.type
== typ
) {
99 let new_matched
= m
.matched
.concat(ttbm
);
101 _tag
: "Some", value
: {
102 matched
: new_matched
,
103 remained
: m
.remained
.slice(1),
110 return { _tag
: "None" };
114 exports
.m1TType
= m1TType
;
119 let tInt
= m1TType(tk
.TokenType
.INT
);
120 let tId
= m1TType(tk
.TokenType
.ID
);
121 let tAdd
= m1TType(tk
.TokenType
.I_ADD
);
122 let tSub
= m1TType(tk
.TokenType
.I_SUB
);
123 let tMul
= m1TType(tk
.TokenType
.I_MUL
);
124 let tDiv
= m1TType(tk
.TokenType
.I_DIV
);
125 let tLParen
= m1TType(tk
.TokenType
.L_PAREN
);
126 let tRParen
= m1TType(tk
.TokenType
.R_PAREN
);
127 let toSome
= tk
.toSome
;
128 node_process_1
.argv
.forEach((val
, index
) => {
129 console
.log(`${index}=${val}`);
132 * like `m ==> f` in ocaml
133 * @param m matchee wrapped
134 * @param f matching function
135 * @returns wrapped result
137 function thenDo(m
, f
) {
138 if (m
._tag
== "None") {
143 if (a
._tag
== "Some") {
144 a
.value
.ast
= concat(m
.value
.ast
, a
.value
.ast
);
150 * like `f1 | f2` in regex
151 * @param f1 the first tried function
152 * @param f2 the second tried function
153 * @returns wrapped result
155 function orDo(f1
, f2
) {
158 if (res1
._tag
== "Some") {
169 * @param m : the `MatcheePair` to be consumed.
170 * @returns if the length of `m.remained` >= 1; consumes the matchee by 1 token
171 * and wraps it in `Some`,
172 * otherwise, returns `None`.
174 function matchAny(m
) {
175 if (m
.remained
.length
>= 1) {
177 _tag
: "Some", value
: {
178 matched
: m
.matched
.concat(m
.remained
[0]),
179 remained
: m
.remained
.slice(1),
180 ast
: [m
.remained
[0]],
185 return { _tag
: "None" };
188 exports
.matchAny
= matchAny
;
190 * Danger : Maybe it's not enough to work.
191 * @description repeating matching function `f`
192 * zero or more times, like the asterisk `*` in regex `f*` .
193 * @param f : the function to be repeated 0+ times.
194 * @returns:the combined function
196 function OnceOrMoreDo(f
) {
198 var wrappedOldX
= { _tag
: "Some", value
: x
};
199 var wrappedNewX
= wrappedOldX
;
201 while (wrappedNewX
._tag
!= "None") {
202 wrappedOldX
= wrappedNewX
;
203 wrappedNewX
= thenDo(wrappedOldX
, f
);
208 return { _tag
: "None" };
210 let ast
= wrappedOldX
.value
.ast
;
211 wrappedOldX
.value
.ast
= ast
.slice(ast
.length
- counter
);
212 console
.log(repr(wrappedOldX
.value
.ast
));
216 exports
.OnceOrMoreDo
= OnceOrMoreDo
;
218 * aux function for midfix operator
220 * @param signal the rule name
223 let midfix
= (f
, signal
) => (x
) => {
225 if (a
._tag
== "Some") {
226 let ast_tail
= slice(a
.value
.ast
, a
.value
.ast
.length
- 3);
227 let new_ast
= [ast_tail
];
228 a
.value
.ast
= new_ast
;
229 // console.log("+"+signal+"+"+repr(a));
233 let circumfix
= (f
, signal
) => (x
) => {
235 if (a
._tag
== "Some") {
236 let inner
= a
.value
.ast
[a
.value
.ast
.length
- 2];
237 let ast_middle
= [inner
];
238 let new_ast
= [ast_middle
];
239 a
.value
.ast
= new_ast
;
243 /** single1 = tInt | "(" expr ")"*/
244 let single1
= circumfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), tLParen
), expr
), tRParen
), "fac1");
246 let single
= orDo(single1
, single2
);
247 /** func = single | single "(" single ")"
250 * func = single | func_aux ( int )
253 /** callees = "(" args ")" | "(" ")" */
254 let callees1
= circumfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), tLParen
), tInt
), tRParen
), "callees1");
255 let callees2
= (x
) => {
256 let ret
= thenDo(thenDo(tk
.toSome(x
), tLParen
), tRParen
);
257 if (ret
._tag
== "Some") {
259 ret
.value
.ast
= new_ast
;
263 let callees
= orDo(callees1
, callees2
);
264 /** %apply R combinating token */
267 type
: tk
.TokenType
.ID
,
271 /** facAux = callees facAux | callees */
272 let facAux1
= (x
) => {
273 var ret
= thenDo(thenDo(tk
.toSome(x
), callees
), facAux
);
274 if (ret
._tag
== "Some") {
275 console
.log("1232345" + repr(tkTreeToSExp(ret
.value
.ast
[ret
.value
.ast
.length
- 1])));
276 let last1
= ret
.value
.ast
[ret
.value
.ast
.length
- 1];
277 let last2
= ret
.value
.ast
[ret
.value
.ast
.length
- 2];
278 let b
= [applyToken
];
279 ret
.value
.ast
= [b
.concat([last2
, last1
])];
280 console
.log("11111" + repr(tkTreeToSExp(ret
.value
.ast
)));
285 let facAux2
= callees
;
286 let facAux
= orDo(facAux1
, facAux2
);
287 /** fac = single facAux | single
288 * Issue1 to be fixed.
291 var ret
= thenDo(thenDo(tk
.toSome(x
), single
), facAux
);
292 if (ret
._tag
== "Some") {
293 console
.log("777" + repr(tkTreeToSExp(ret
.value
.ast
)));
294 ret
.value
.ast
= [applyToken
, ret
.value
.ast
[ret
.value
.ast
.length
- 2],
295 ret
.value
.ast
[ret
.value
.ast
.length
- 1]];
297 rearrangeTree(ret
.value
.ast
);
298 console
.log("888" + repr(tkTreeToSExp(ret
.value
.ast
)));
303 let fac
= orDo(fac1
, fac2
);
305 * rearrangeTree : for applyToken subtree from right-combination to
308 * @return another ast
310 function rearrangeTree(x
) {
311 if (x
!== undefined) {
312 for (var i
= 1; i
< x
.length
; i
++) {
315 console
.log("@@" + repr(x
[0]));
316 if (x
[0] == applyToken
) {
317 if (Array
.isArray(x
[2]) && x
[2][0] == applyToken
) {
318 let rl
= rearrangeTree(x
[2][1]);
319 let rr
= rearrangeTree(x
[2][2]);
320 let l
= rearrangeTree(x
[1]);
322 x
[1] = [applyToken
, l
, rl
];
324 console
.log("@@==" + repr(x
));
329 x
[1] = rearrangeTree(x
[1]);
330 x
[2] = rearrangeTree(x
[2]);
331 console
.log("@@==" + repr(x
));
340 * term1 = fac (MUL | DIV) fac
342 let term1
= midfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), fac
), orDo(tMul
, tDiv
)), fac
), "term1");
345 * term2 = int MUL int
349 * term = term1 | term2
351 let term
= orDo(term1
, term2
);
354 * expr1 = term ADD term
356 let expr1
= midfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), term
), orDo(tAdd
, tSub
)), term
), "expr1");
362 * expr = expr1 | expr2
364 let expr
= orDo(expr1
, expr2
);
365 let tokens
= tk
.tokenize("1");
366 let tokens2
= tk
.tokenize("1(2)");
367 let tokens3
= tk
.tokenize("1(2)(3)");
368 let tokens4
= tk
.tokenize("2()");
369 //let tokens = tk.tokenize("(4-(3/4))");
370 //tk.tokenize(argv[2]);
371 let tokensFiltered
= tokens4
.filter((x
) => {
372 return (x
.type
!= tk
.TokenType
.NL
373 && x
.type
!= tk
.TokenType
.SP
);
377 remained
: tokensFiltered
,
380 if (beta
._tag
== "Some") {
381 beta
.value
.ast
= rearrangeTree(beta
.value
.ast
);
382 console
.log(tkTreeToSExp(beta
.value
.ast
));
384 console
.log("RESULT=" + repr(beta
));