]>
git.kianting.info Git - clo/blob - src/index.ts
1 var fs
= require('fs');
2 import jsTokens from
"js-tokens";
3 import * as util from
'util';
4 import * as p from
'typescript-parsec';
5 import { Token
} from
'typescript-parsec';
11 * convert a `tkTree` AST to S-expr string
12 * @param t the `tkTree`
13 * @returns S-expr String
15 export function tkTreeToSExp(t
: tkTree
): string{
18 if (Array.isArray(t
)){
19 let strArray
= t
.map((x
)=>tkTreeToSExp(x
));
20 str
= "(" + strArray
.join(" ") + ")";
32 /**inspect the inner of the representation. */
33 let repr
= (x
: any)=>{return util
.inspect(x
, {depth
: null})};
40 type tkTree
= string | tkTree
[];
57 const lexer
= p
.buildLexer([
58 [true, /^\d
+(\
.\d
+)?/g
, TokenKind
.Number],
59 [true, /^\
;/g
, TokenKind
.Semicolon
],
60 [true, /^[-][-][-]/g
, TokenKind
.Seperator
],
61 [true, /^[\
+\
-\
*\
/\
&\
|\
!\
^\
<\
>\
~\
=\?]+/g
, TokenKind
.Op
],
62 [true, /^\@
+/g
, TokenKind
.ExprMark
],
63 [true, /^[()\
[\
]{}]/g
, TokenKind
.Paren
],
64 [true, /^["]([\"]|[\\].)*["]/g
, TokenKind
.Str
],
65 [true, /^[']([\']|[\\].)*[']/g
, TokenKind
.Str
],
66 [true, /^[()\
[\
]{}]/g
, TokenKind
.Paren
],
67 [true, /^[^\s
\n\t\r;]+/g
, TokenKind
.Id
],
68 [false, /^(\s
|\n|\r|\t)+/g
, TokenKind
.SpaceNL
]
81 const PROG
= p
.rule
<TokenKind
, tkTree
>();
82 const UNIT
= p
.rule
<TokenKind
, tkTree
>();
83 const IMPORTS
= p
.rule
<TokenKind
, tkTree
>();
84 const SEMICOLON
= p
.rule
<TokenKind
, tkTree
>();
87 let doubleMinus
= { type: 'Punctuator', value
: '--' };
88 let doubleMinus2
= p
.str('--');
89 const TERM
= p
.rule
<TokenKind
, tkTree
>();
91 function applyUnit(value
: Token
<TokenKind
.Number>): tkTree
{
95 function applySemiColon(value
: Token
<TokenKind
.Semicolon
>): tkTree
{
99 function applyParts(first
: tkTree
,
100 second
: [Token
<TokenKind
>, tkTree
]):tkTree
{
101 return ["%clo", first
, second
[1]];
107 function applyImports(input
: [Token
<TokenKind
>,Token
<TokenKind
>[], tkTree
]):tkTree
{
108 let importTail
= input
[1].map(x
=>x
.text
);
109 return ["import"].concat(importTail
);
113 * PROG : IMPORTS '---' UNIT;
116 p
.lrec_sc(IMPORTS
, p
.seq(p
.str('---'), UNIT
), applyParts
)
121 * PROG : 'import' Id* SEMICOLON;
124 p
.apply(p
.seq(p
.str('import'), p
.rep_sc(p
.tok(TokenKind
.Id
)), SEMICOLON
) , applyImports
)
130 SEMICOLON
.setPattern(
131 p
.apply(p
.tok(TokenKind
.Semicolon
), applySemiColon
)
138 p
.apply(p
.tok(TokenKind
.Number), applyUnit
)
141 let tree
= p
.expectSingleResult(p
.expectEOF(PROG
.parse(lexer
.parse(inputTxt
))));
145 console
.log("RESULT="+tkTreeToSExp(tree
));