]>
git.kianting.info Git - uann/blob - index.js
4163e92ef817fdc17ff1d4deda28ceedc56fadba
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
.m1TType
= 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.");
59 * match one token type.
61 * it returns a function which test if the type of first token of the `remained` part of
62 * the argument of the function is `typ` , if it's true, update the `TokenMatcheePair` wrapped
63 * in `Some`. Otherwise, it returns `None`.
64 * * @param typ : the type to be test.
65 * @returns the updated `TokenMatcheePair` wrapped in `Some(x)` or `None`.
67 function m1TType(typ
) {
69 if (m
.remained
.length
== 0) {
70 return { _tag
: "None" };
75 const ttbm
= m
.remained
[0];
76 if (ttbm
.type
== typ
) {
77 let new_matched
= m
.matched
.concat(ttbm
);
79 _tag
: "Some", value
: {
81 remained
: m
.remained
.slice(1),
88 return { _tag
: "None" };
92 exports
.m1TType
= m1TType
;
97 let tInt
= m1TType(tk
.TokenType
.INT
);
98 let tAdd
= m1TType(tk
.TokenType
.I_ADD
);
99 let tSub
= m1TType(tk
.TokenType
.I_SUB
);
100 let tMul
= m1TType(tk
.TokenType
.I_MUL
);
101 let tDiv
= m1TType(tk
.TokenType
.I_DIV
);
102 let tLParen
= m1TType(tk
.TokenType
.L_PAREN
);
103 let tRParen
= m1TType(tk
.TokenType
.R_PAREN
);
104 let toSome
= tk
.toSome
;
105 node_process_1
.argv
.forEach((val
, index
) => {
106 console
.log(`${index}=${val}`);
109 * like `m ==> f` in ocaml
110 * @param m matchee wrapped
111 * @param f matching function
112 * @returns wrapped result
114 function thenDo(m
, f
) {
115 if (m
._tag
== "None") {
120 if (a
._tag
== "Some") {
121 a
.value
.ast
= concat(m
.value
.ast
, a
.value
.ast
);
127 * like `f1 | f2` in regex
128 * @param f1 the first tried function
129 * @param f2 the second tried function
130 * @returns wrapped result
132 function orDo(f1
, f2
) {
135 if (res1
._tag
== "Some") {
145 * aux function for midfix operator
147 * @param signal the rule name
150 let midfix
= (f
, signal
) => (x
) => {
152 if (a
._tag
== "Some") {
153 let ast_tail
= slice(a
.value
.ast
, a
.value
.ast
.length
- 3);
154 let new_ast
= [ast_tail
];
155 a
.value
.ast
= new_ast
;
156 console
.log("+" + signal
+ "+" + repr(a
));
160 let circumfix
= (f
, signal
) => (x
) => {
162 if (a
._tag
== "Some") {
163 let inner
= a
.value
.ast
[a
.value
.ast
.length
- 2];
164 let ast_middle
= [inner
];
165 let new_ast
= [ast_middle
];
166 a
.value
.ast
= new_ast
;
171 * TODO: 12(13)(14) only parsed with only 12(13)
173 /** single1 = tInt | "(" expr ")"*/
174 let single1
= circumfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), tLParen
), expr
), tRParen
), "fac1");
176 let single
= orDo(single1
, single2
);
177 /** fac1 = single "(" int ")" | single */
178 let fac1Appliee
= circumfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), tLParen
), tInt
), tRParen
), "fac1");
180 let n
= thenDo(thenDo(toSome(x
), single
), fac1Appliee
);
181 console
.log("+" + "bocchitherock" + "+" + repr(n
));
185 let fac
= orDo(fac1
, fac2
);
188 * term1 = fac (MUL | DIV) fac
190 let term1
= midfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), fac
), orDo(tMul
, tDiv
)), fac
), "term1");
193 * term2 = int MUL int
197 * term = term1 | term2
199 let term
= orDo(term1
, term2
);
202 * expr1 = term ADD term
204 let expr1
= midfix((x
) => thenDo(thenDo(thenDo(tk
.toSome(x
), term
), orDo(tAdd
, tSub
)), term
), "expr1");
210 * expr = expr1 | expr2
212 let expr
= orDo(expr1
, expr2
);
213 let tokens
= tk
.tokenize("12(13)(14)");
214 //let tokens = tk.tokenize("(4-(3/4))");
215 //tk.tokenize(argv[2]);
216 let tokensFiltered
= tokens
.filter((x
) => {
217 return (x
.type
!= tk
.TokenType
.NL
218 && x
.type
!= tk
.TokenType
.SP
);
220 let wrappedTokens
= tk
.toSome({
222 remained
: tokensFiltered
,
227 remained
: tokensFiltered
,
230 console
.log("RESULT=" + repr(beta
));