]> git.kianting.info Git - clo/blobdiff - src/index.ts
english breakline, and generate try to count the text size
[clo] / src / index.ts
index f5f55af9cc5f0fbe26e6b8b9e8a54345f5021767..44aa79282788f7f8fd28679017ceb114c49c3149 100644 (file)
 var fs = require('fs');
-import jsTokens from "js-tokens";
-import * as util from 'util';
-import * as p from 'typescript-parsec';
-import { Token } from 'typescript-parsec';
-import { TokenType } from "./tokenize";
-/**
- * 
- * # REPRESENTATION
- */
-/**
- * convert a `tkTree` AST to S-expr string
- * @param t the `tkTree`
- * @returns S-expr String
- */
-export function tkTreeToSExp(t: tkTree): string{
-    var str = "";
-
-    if (Array.isArray(t)){
-        let strArray = t.map((x)=>tkTreeToSExp(x));
-        str = "(" + strArray.join(" ") + ")";
-    }else{
-        if (t=== undefined){
-            str = "%undefined"
-        }else{
-            str = t;
-        }
-    }
-
-    return str;
-}
-
-/**inspect the inner of the representation. */
-let repr = (x : any)=>{return util.inspect(x, {depth: null})};
-/**
- * 
- * # TYPES
- */
+var argv : any = require('minimist')(process.argv.slice(2));
 
-
-type tkTree = string | tkTree[];
-
-enum TokenKind {
-    Seperator, // ---
-    Semicolon, // ;
-    Number,
-    Op,
-    ExprMark, // @
-    ExcapeAt, // \@
-    Paren,
-    SpaceNL, // \s\t\n\r
-    Id,
-    Str,
-    Comment, // /* ooo */
-}
+import * as parser from "./parser.js";
 
 /**
- * Parsing
+ * help for inputing `--help` parameter.
  */
-const lexer = p.buildLexer([
-    [true, /^\d+(\.\d+)?/g, TokenKind.Number],
-    [true, /^\\\@/g, TokenKind.ExcapeAt],
-    [true, /^\/\*([^/]|\/[^*])*\*\//g, TokenKind.Comment],
-    [true, /^\;/g, TokenKind.Semicolon],
-    [true, /^[-][-][-]/g, TokenKind.Seperator],
-    [true, /^[\+\-\*\/\&\|\!\^\<\>\~\=\?]+/g, TokenKind.Op],
-    [true, /^\@/g, TokenKind.ExprMark],
-    [true, /^[()\[\]{}]/g, TokenKind.Paren],
-    [true, /^["]([\"]|[\\].)*["]/g, TokenKind.Str],
-    [true, /^[']([\']|[\\].)*[']/g, TokenKind.Str],
-    [true, /^[()\[\]{}]/g, TokenKind.Paren],
-    [true, /^[^\/\\\@\s\n\t\r;]+/g, TokenKind.Id],
-    [true, /^(\s|\n|\r|\t)+/g, TokenKind.SpaceNL],
+export let helpDesc =
+`
+clo: clo INPUT_FILE --output-js OUTPUT_JS_FILE
 
-]);
+\ta little typesetter powered by TypeScript/Javascript.
 
-/**
- * 
- * # TEST
- */
-const inputTxt=
-`import a as b; /*bacourt*/
-/* ba choir 
-ipsum lorem*/
+## Arguments
+INPUT_FILE\tan input .clo file
 
-import you as john;
+## Parameters
 ---
+--output-js\tgenerated the output middle JS file
 
-臺中市\\\@
-
-政府
-@2+2==4;
-
-console.log("122");@
-
-人民
-`;
-
-
-const PROG = p.rule<TokenKind, tkTree>();
-const SEGMENT = p.rule<TokenKind, tkTree>();
-const IMPORT = p.rule<TokenKind, tkTree>();
-const IMPORTS = p.rule<TokenKind, tkTree>();
-const SEMICOLON = p.rule<TokenKind, tkTree>();
-const EXCAPE_AT = p.rule<TokenKind, tkTree>();
-const NOT_AT_TEXT = p.rule<TokenKind, tkTree>();
-const CONTENT = p.rule<TokenKind, tkTree>();
-
-let doubleMinus = { type: 'Punctuator', value: '--' };
-let doubleMinus2 = p.str('--');
-const TERM = p.rule<TokenKind, tkTree>();
-
-function applySegment(input: [Token<TokenKind>, Token<TokenKind>[],
-        Token<TokenKind>]): tkTree[]{
-    let unpackedInnerExprs = input[1].map((x)=>{return x.text});
-    return ["%exprs", unpackedInnerExprs];
-}
-
-function applySemiColon(value: Token<TokenKind.Semicolon>): tkTree{
-    return value.text;
-}
-
-function applyParts(first: tkTree,
-                    second: [Token<TokenKind>, tkTree]):tkTree {
-    return ["%clo", first , second[1]];
-}
-
-
-function applyComment(value: Token<TokenKind.Comment>): tkTree[]{
-    return [value.text];
-}
 
+Report bugs to: clo@kianting.info
+clo home page: <https://kianting.info/wiki/w/Project:Clo>
+`
 
-function applyImport(input: [Token<TokenKind>,Token<TokenKind>[], tkTree]) : tkTree{
-    let importTail = input[1].map(x=>x.text);
-    return ["import"].concat(importTail);
-};
-
-
-/*
-function applyImportComment(input: [Token<TokenKind>,Token<TokenKind>[],
-    tkTree, Token<TokenKind.Comment>]) : tkTree{
-    let importTail = input[1].map(x=>x.text);
-    let comment = [input[3].text];
-    return ["import"].concat(importTail).concat(comment);
-};*/
-
-function applyImports(input : [tkTree, tkTree[]]): tkTree{
-    let resultBody = [input[0]].concat(input[1]);
-    let resultWrapper = ["%import", resultBody];
-    return resultWrapper;
-};
-
-
-
-
-function applyNotAtText(value : Token<TokenKind>): tkTree{
-    if (value.text == "\\\@"){
-        return '@';
-    }
-    else{return value.text;}
-};
-
-function applyText (input : tkTree): tkTree[]{
-    return ["%text", input];
-};
-
-function applyContent(input : tkTree[]): tkTree[]{
-    return ["%content", input];
-};
-
-function applySpaceNL(value : Token<TokenKind.SpaceNL>): tkTree{
-    return value.text;
-}
+processArgv(argv, helpDesc);
 
 /**
- * IMPORTEE:  Number, Op, Paren, Id, Str, Comment,
+ * processing the passed `argv` (arguments)
  */
-let IMPORTEE = p.alt(p.tok(TokenKind.Number),
-    p.tok(TokenKind.Op),
-    p.tok(TokenKind.Paren),
-    p.tok(TokenKind.Id),
-    p.tok(TokenKind.Str),
-    p.tok(TokenKind.SpaceNL),
-    p.tok(TokenKind.Comment));
 
-let NOT_AT = p.alt(p.tok(TokenKind.Seperator),
-    p.tok(TokenKind.Semicolon),
-    p.tok(TokenKind.Number),
-    p.tok(TokenKind.ExcapeAt),
-    p.tok(TokenKind.Op),
-    p.tok(TokenKind.Paren),
-    p.tok(TokenKind.SpaceNL),
-    p.tok(TokenKind.Id),
-    p.tok(TokenKind.Str),
-    p.tok(TokenKind.Comment),
-    );
+export function processArgv(argv : any, helpDesc : string){
+    let inputFile : string[] = argv['_'];
+    let outputJSFile : string | true = argv['output-js'];
 
-/**
- * PROG : IMPORTS '---' CONTENT;
- */
-PROG.setPattern(
-    p.lrec_sc(IMPORTS, p.seq(p.str('---'), CONTENT), applyParts)
+    let NoInputFile : boolean = (inputFile.length == 0);
+    let NoOutputJSFile : boolean = (outputJSFile === undefined || outputJSFile == true);
+    let helpTriggered : boolean = argv['help'];
 
-)
-
-/**
- * NOT_AT_TEXT : NOT_AT
- */
-NOT_AT_TEXT.setPattern(
-    p.apply(NOT_AT, applyNotAtText)
-);
-
-IMPORTS.setPattern(
-    p.apply( p.seq(IMPORT, p.rep(IMPORT)), applyImports)
-);
+    if (inputFile.length > 1){
+        console.log("Sorry, the input file should be only one.");
+    }
 
-/**
- * IMPORT :
- * 'import' IMPORTEE* SEMICOLON |
- * COMMENT |
- */
-IMPORT.setPattern(
-    p.alt(
-        p.apply(p.seq(p.str('import'), p.rep_sc(IMPORTEE), SEMICOLON),
-            applyImport),
-        p.apply(p.tok(TokenKind.Comment), applyComment),
-        p.apply(p.tok(TokenKind.SpaceNL), applySpaceNL)
+    /** output --help */
+    if (helpTriggered || NoInputFile || NoOutputJSFile){
+        console.log(helpDesc);
+    }else{
+        fs.readFile(inputFile[0], 'utf8', (err : Error, inputText : string) => {
+            if (err) throw err;
 
-    )
-);
+            let tree = parser.inputTextToTree(inputText);
 
-/**
- * SEMICOLON : ';';
- */
-SEMICOLON.setPattern(
-    p.apply(p.tok(TokenKind.Semicolon), applySemiColon)
-);
+            let output = parser.treeToJS(tree);
 
+            fs.writeFile(outputJSFile, output , (err : Error) => {
+                if (err) throw err;
+              });
 
+          }); 
+    }
 
-/**
- * SEGMENT : '@' NOT_AT* '@' |
- * (NOT_AT_TEXT | EXCAPE_AT)*
- */
-SEGMENT.setPattern(
-    p.alt(
-        p.apply(p.rep_sc(NOT_AT_TEXT), applyText),
-        p.apply(p.seq(p.str('@'), p.rep(NOT_AT), p.str('@')), applySegment),
-    )
-);
-
-/**
- * CONTENT : SEGMENT*
- */
-CONTENT.setPattern(
-    p.apply(p.rep(SEGMENT), applyContent)
-);
+}
 
 
-console.log(repr(lexer.parse(inputTxt)));
-let tree = p.expectSingleResult(p.expectEOF(PROG.parse(lexer.parse(inputTxt))));
 
 
 
-console.log("RESULT="+tkTreeToSExp(tree));