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));