-/** facAux = callees facAux | callees */
-let facAux1 = (x: TokenMatcheePair)=>{
- var ret = thenDo(thenDo(toSome(x), callees), facAux);
- if (ret._tag == "Some"){
- console.log("1232345"+repr(tkTreeToSExp(ret.value.ast[ret.value.ast.length-1])));
- let last1 = ret.value.ast[ret.value.ast.length-1];
- let last2 = ret.value.ast[ret.value.ast.length-2];
-
-
- let b : tkTree[] = [applyToken];
- ret.value.ast = [b.concat([last2, last1])];
- console.log("11111"+repr(tkTreeToSExp(ret.value.ast)));
-
- };
-
-return ret;}
-let facAux2 = callees;
-let facAux = orDo(facAux1, facAux2);
-
-
-
-/** fac = single facAux | single
- * Issue1 to be fixed.
- */
-let fac1 = (x: TokenMatcheePair)=>{
- var ret = thenDo(thenDo(toSome(x), single),facAux);
- if(ret._tag == "Some"){
- console.log("777"+repr(tkTreeToSExp(ret.value.ast)));
- ret.value.ast = [applyToken, ret.value.ast[ret.value.ast.length-2],
- ret.value.ast[ret.value.ast.length-1]];
- ret.value.ast;
- rearrangeTree(ret.value.ast);
- console.log("888"+repr(tkTreeToSExp(ret.value.ast)));
-
- }
-
- return ret;};
-let fac2 = single;
-let fac = orDo(fac1, fac2);
-
-
-/**
- * rearrangeTree : for applyToken subtree from right-combination to
- * left-combination
- * @input x a ast
- * @return another ast
- */
-function rearrangeTree(x: any) : any {
-
- if (x !== undefined){
- for (var i=1;i<x.length;i++){
- rearrangeTree(x[i]);
- }
- console.log("@@"+repr(x[0]));
-
- if (x[0] == applyToken){
- if (Array.isArray(x[2]) && x[2][0] == applyToken){
- let rl = rearrangeTree(x[2][1]);
- let rr = rearrangeTree(x[2][2]);
- let l = rearrangeTree(x[1]);
- x[0] = applyToken;
- x[1] = [applyToken, l, rl];
- x[2] = rr;
- console.log("@@=="+repr(x));
-
- return x;
- }
- else{
- x[0] = applyToken;
- x[1] = rearrangeTree(x[1]);
- x[2] = rearrangeTree(x[2]);
- console.log("@@=="+repr(x));
-
-
- return x;
- }
+function matchToken(typeName : string, value? : string):
+ (t : TokenPair) => Maybe<TokenPair>{
+ return (t)=>{
+ let headToken = t.remained[0];
+ if (headToken.type != typeName){
+ return {_tag:"None"};
+ }else{
+ if (value === undefined || value == headToken.value){
+ let newTokenPair = {
+ matched: t.matched.concat(headToken),
+ remained: t.remained.slice(1),
+ ast : [headToken]
+ };
+ return {_tag : "Some", value : newTokenPair};
+ }else{
+ return {_tag:"None"};