X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Findex.ts;h=0d94c74c6fb2434f783f1451c0b86f3824973a80;hb=1a7598fd6e01515661591a41320a63451cb82d5f;hp=4c1ce91924e0cfe689858d9ee19fc43e8890e0e2;hpb=f801ef14fc25ae122aaef4aede639ddb9b37006a;p=clo diff --git a/src/index.ts b/src/index.ts index 4c1ce91..0d94c74 100644 --- a/src/index.ts +++ b/src/index.ts @@ -95,7 +95,13 @@ export function m1TType(typ: tk.TokenType): */ let tInt = m1TType(tk.TokenType.INT); let tAdd = m1TType(tk.TokenType.I_ADD); +let tSub = m1TType(tk.TokenType.I_SUB); let tMul = m1TType(tk.TokenType.I_MUL); +let tDiv = m1TType(tk.TokenType.I_DIV); +let tLParen = m1TType(tk.TokenType.L_PAREN); +let tRParen = m1TType(tk.TokenType.R_PAREN); + +let toSome = tk.toSome; argv.forEach((val, index) => { @@ -141,10 +147,15 @@ function orDo(f1 : Function, f2 : Function){ } +/** + * aux function for midfix operator + * @param f function + * @param signal the rule name + * @returns + */ let midfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{ var a = f(x); if (a._tag == "Some"){ - let ast_head : tkTree[] = slice(a.value.ast,0,a.value.ast.length-3); let ast_tail : tkTree[] = slice(a.value.ast,a.value.ast.length-3); let new_ast = [ast_tail]; a.value.ast = new_ast; @@ -156,43 +167,71 @@ let midfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{ return a; } +let circumfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{ + var a = f(x); + if (a._tag == "Some"){ + let inner = a.value.ast[a.value.ast.length-2]; + let ast_middle : tkTree[] = [inner]; + let new_ast = [ast_middle]; + a.value.ast = new_ast; + } + return a; +} + /** - * - * fac1 = int MUL int + * TODO: 12(13)(14) only parsed with only 12(13) */ -//let fac1 = midfix((x : TokenMatcheePair)=> -// thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt)); +/** single1 = tInt | "(" expr ")"*/ +let single1 = circumfix((x : TokenMatcheePair) => + thenDo(thenDo(thenDo(tk.toSome(x), tLParen), expr), tRParen), "fac1"); +let single2= tInt; +let single = orDo(single1, single2); + +/** fac1 = single "(" int ")" | single */ +let fac1Appliee = circumfix((x : TokenMatcheePair) => thenDo(thenDo(thenDo(tk.toSome(x), tLParen), tInt), tRParen), "fac1"); +let fac1 = (x : TokenMatcheePair) => + { + let n = thenDo(thenDo(toSome(x), single), fac1Appliee); + + console.log("+"+"bocchitherock"+"+"+repr(n)); + + return n + }; +let fac2 = single; +let fac = orDo(fac1, fac2); -let fac1 = (x : TokenMatcheePair) => { - let a = midfix((x : TokenMatcheePair)=> - thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt), "fac1")(x); - return a; -} +/** + * + * term1 = fac (MUL | DIV) fac + */ + +let term1 = midfix((x : TokenMatcheePair)=> + thenDo(thenDo(thenDo(tk.toSome(x), fac), orDo(tMul,tDiv)), fac), "term1"); /** * - * fac2 = int MUL int + * term2 = int MUL int */ -let fac2 = tInt; +let term2 = fac; /** - * fac = fac1 | fac2 + * term = term1 | term2 */ -let fac = orDo(fac1, fac2); +let term = orDo(term1, term2); /** * - * expr1 = fac ADD fac + * expr1 = term ADD term */ let expr1 = midfix((x : TokenMatcheePair)=> - thenDo(thenDo(thenDo(tk.toSome(x), fac), tAdd), fac), "expr1"); + thenDo(thenDo(thenDo(tk.toSome(x), term), orDo(tAdd,tSub)), term), "expr1"); /** - * expr2 = fac + * expr2 = term */ -let expr2 = fac; +let expr2 = term; /** * expr = expr1 | expr2 @@ -201,8 +240,10 @@ let expr = orDo(expr1, expr2); +let tokens = tk.tokenize("12(13)(14)"); +//let tokens = tk.tokenize("(4-(3/4))"); +//tk.tokenize(argv[2]); -let tokens = tk.tokenize("2+3*4");//tk.tokenize(argv[2]); let tokensFiltered = tokens.filter( (x)=>{return (x.type != tk.TokenType.NL && x.type != tk.TokenType.SP)}); @@ -218,7 +259,6 @@ let beta = expr({ remained : tokensFiltered, ast : []}); -console.log(repr(wrappedTokens)); -console.log(repr(beta)); +console.log("RESULT="+repr(beta));