X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Findex.ts;h=9542e0ff962156c9bb06fadfe4a1234761605055;hb=a37fd632a73c234b3095fd1dbd86927a9cc26af7;hp=157b1607348020eac4b7e8648093eb77ff8059c6;hpb=8d03cc503c747bb974c75d39f8b9c0678a9cc91f;p=clo diff --git a/src/index.ts b/src/index.ts index 157b160..9542e0f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,145 +1,66 @@ 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 = ""; - - 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; -} +var argv : any = require('minimist')(process.argv.slice(2)); -/**inspect the inner of the representation. */ -let repr = (x : any)=>{return util.inspect(x, {depth: null})}; -/** - * - * # TYPES - */ +import * as parser from "./parser.js"; -type tkTree = string | tkTree[]; +let helpDesc = +` +clo: clo INPUT_FILE --output-js OUTPUT_JS_FILE -enum TokenKind { - Seperator, - Semicolon, - Number, - Op, - ExprMark, - Paren, - SpaceNL, - Id, - Str, -} +\ta little typesetter powered by TypeScript/Javascript. -/** - * 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] -]); +## Arguments +INPUT_FILE\tan input .clo file -/** - * - * # TEST - */ -const inputTxt= -`import ast; +## Parameters --- -122`; +--output-js\tgenerated the output middle JS file -const PROG = p.rule(); -const UNIT = p.rule(); -const IMPORTS = p.rule(); -const SEMICOLON = p.rule(); +Report bugs to: clo@kianting.info +clo home page: +` +processArgv(argv, helpDesc); -let doubleMinus = { type: 'Punctuator', value: '--' }; -let doubleMinus2 = p.str('--'); -const TERM = p.rule(); - -function applyUnit(value: Token): tkTree{ - return value.text; -} - -function applySemiColon(value: Token): tkTree{ - return value.text; -} +/** + * processing the passed `argv` (arguments) + */ -function applyParts(first: tkTree, - second: [Token, tkTree]):tkTree { - return ["%clo", first , second[1]]; -} +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,Token[], 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));