]> git.kianting.info Git - clo/blobdiff - src/index.ts
english breakline, and generate try to count the text size
[clo] / src / index.ts
index 157b1607348020eac4b7e8648093eb77ff8059c6..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';
-/**
- * 
- * # 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 = "";
+var argv : any = require('minimist')(process.argv.slice(2));
 
-    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;
-}
+import * as parser from "./parser.js";
 
-/**inspect the inner of the representation. */
-let repr = (x : any)=>{return util.inspect(x, {depth: null})};
 /**
- * 
- * # TYPES
+ * help for inputing `--help` parameter.
  */
+export let helpDesc =
+`
+clo: clo INPUT_FILE --output-js OUTPUT_JS_FILE
 
+\ta little typesetter powered by TypeScript/Javascript.
 
-type tkTree = string | tkTree[];
+## Arguments
+INPUT_FILE\tan input .clo file
 
-enum TokenKind {
-    Seperator,
-    Semicolon,
-    Number,
-    Op,
-    ExprMark,
-    Paren,
-    SpaceNL,
-    Id,
-    Str,
-}
-
-/**
- * Parsing
- */
-const lexer = p.buildLexer([
-    [true, /^\d+(\.\d+)?/g, TokenKind.Number],
-    [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],
-    [false, /^(\s|\n|\r|\t)+/g, TokenKind.SpaceNL]
-]);
-
-/**
- * 
- * # TEST
- */
-const inputTxt=
-`import ast;
+## Parameters
 ---
-122`;
-
-
-const PROG = p.rule<TokenKind, tkTree>();
-const UNIT = p.rule<TokenKind, tkTree>();
-const IMPORTS = p.rule<TokenKind, tkTree>();
-const SEMICOLON = p.rule<TokenKind, tkTree>();
+--output-js\tgenerated the output middle JS file
 
 
-let doubleMinus = { type: 'Punctuator', value: '--' };
-let doubleMinus2 = p.str('--');
-const TERM = p.rule<TokenKind, tkTree>();
+Report bugs to: clo@kianting.info
+clo home page: <https://kianting.info/wiki/w/Project:Clo>
+`
 
-function applyUnit(value: Token<TokenKind.Number>): tkTree{
-    return value.text;
-}
+processArgv(argv, helpDesc);
 
-function applySemiColon(value: Token<TokenKind.Semicolon>): tkTree{
-    return value.text;
-}
+/**
+ * processing the passed `argv` (arguments)
+ */
 
-function applyParts(first: tkTree,
-                    second: [Token<TokenKind>, tkTree]):tkTree {
-    return ["%clo", first , second[1]];
-}
+export function processArgv(argv : any, helpDesc : string){
+    let inputFile : string[] = argv['_'];
+    let outputJSFile : string | true = argv['output-js'];
 
+    let NoInputFile : boolean = (inputFile.length == 0);
+    let NoOutputJSFile : boolean = (outputJSFile === undefined || outputJSFile == true);
+    let helpTriggered : boolean = argv['help'];
 
+    if (inputFile.length > 1){
+        console.log("Sorry, the input file should be only one.");
+    }
 
+    /** output --help */
+    if (helpTriggered || NoInputFile || NoOutputJSFile){
+        console.log(helpDesc);
+    }else{
+        fs.readFile(inputFile[0], 'utf8', (err : Error, inputText : string) => {
+            if (err) throw err;
 
-function applyImports(input: [Token<TokenKind>,Token<TokenKind>[], tkTree]):tkTree{
-    let importTail = input[1].map(x=>x.text);
-    return ["import"].concat(importTail);
-};
+            let tree = parser.inputTextToTree(inputText);
 
-/**
- * PROG : IMPORTS '---' UNIT;
- */
-PROG.setPattern(
-    p.lrec_sc(IMPORTS, p.seq(p.str('---'), UNIT), applyParts)
+            let output = parser.treeToJS(tree);
 
-)
+            fs.writeFile(outputJSFile, output , (err : Error) => {
+                if (err) throw err;
+              });
 
-/**
- * PROG : 'import' Id* SEMICOLON;
- */
-IMPORTS.setPattern(
-    p.apply(p.seq(p.str('import'), p.rep_sc(p.tok(TokenKind.Id)), SEMICOLON) , applyImports)
-);
+          }); 
+    }
 
-/**
- * SEMICOLON : ';';
- */
-SEMICOLON.setPattern(
-    p.apply(p.tok(TokenKind.Semicolon), applySemiColon)
-);
+}
 
-/**
- * UNIT : Number;
- */
-UNIT.setPattern(
-    p.apply(p.tok(TokenKind.Number), applyUnit)
-);
 
-let tree = p.expectSingleResult(p.expectEOF(PROG.parse(lexer.parse(inputTxt))));
 
 
 
-console.log("RESULT="+tkTreeToSExp(tree));