X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Findex.ts;h=44aa79282788f7f8fd28679017ceb114c49c3149;hb=c3dc58d74afa6b298d84bad90d63c027a32a954a;hp=157b1607348020eac4b7e8648093eb77ff8059c6;hpb=8d03cc503c747bb974c75d39f8b9c0678a9cc91f;p=clo diff --git a/src/index.ts b/src/index.ts index 157b160..44aa792 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,145 +1,68 @@ 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(); -const UNIT = p.rule(); -const IMPORTS = p.rule(); -const SEMICOLON = p.rule(); +--output-js\tgenerated the output middle JS file -let doubleMinus = { type: 'Punctuator', value: '--' }; -let doubleMinus2 = p.str('--'); -const TERM = p.rule(); +Report bugs to: clo@kianting.info +clo home page: +` -function applyUnit(value: Token): tkTree{ - return value.text; -} +processArgv(argv, helpDesc); -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]]; -} +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,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));