X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Findex.ts;h=44aa79282788f7f8fd28679017ceb114c49c3149;hb=c3dc58d74afa6b298d84bad90d63c027a32a954a;hp=4c1ce91924e0cfe689858d9ee19fc43e8890e0e2;hpb=f801ef14fc25ae122aaef4aede639ddb9b37006a;p=clo diff --git a/src/index.ts b/src/index.ts index 4c1ce91..44aa792 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,224 +1,68 @@ var fs = require('fs'); -import { argv, resourceUsage } from 'node:process'; -import * as tk from './tokenize.js'; -import * as util from 'util'; -import { drawEllipsePath, reduceRotation } from 'pdf-lib'; -import { isTypedArray } from 'node:util/types'; -import { error } from 'node:console'; +var argv : any = require('minimist')(process.argv.slice(2)); -/** - * debug reprensenting - */ -let repr = (x : any)=>{return util.inspect(x, {depth: null})}; +import * as parser from "./parser.js"; /** - * token tree type. + * help for inputing `--help` parameter. */ -type tkTree = tkTree[] | tk.Token +export let helpDesc = +` +clo: clo INPUT_FILE --output-js OUTPUT_JS_FILE -/** - * concated 2 `tkTree`s - * @param x the array to be concated - * @param y the item or array to ve concated - * @returns concated tkTree array, or thrown error if can't be concated. - */ -function concat(x: tkTree, y:tkTree): tkTree[] { - if (Array.isArray(x)){ - return x.concat(y); - }else{ - throw new Error("the tkTree can't be concated, because it's not an array."); - - } -} - -function slice(x: tkTree, index?:number, end?:number): tkTree[] { - if (Array.isArray(x)){ - return x.slice(index,end); - }else{ - throw new Error("the tkTree can't be concated, because it's not an array."); - - } -} - -/** - * TokenMatcheePair for tokens' parser combinator - * matched: the matched (now and before) tokens - * remained: tokens to be matched - * ast: abstract syntax tree - */ -export interface TokenMatcheePair { - matched: tk.Token[] - remained: tk.Token[] - ast : tkTree[] -} +\ta little typesetter powered by TypeScript/Javascript. -/** - * @description - * match one token type. - * - * it returns a function which test if the type of first token of the `remained` part of - * the argument of the function is `typ` , if it's true, update the `TokenMatcheePair` wrapped - * in `Some`. Otherwise, it returns `None`. - * * @param typ : the type to be test. - * @returns the updated `TokenMatcheePair` wrapped in `Some(x)` or `None`. - */ -export function m1TType(typ: tk.TokenType): - (m: TokenMatcheePair) => tk.Maybe { - return (m: TokenMatcheePair) => { - if (m.remained.length == 0) { - return { _tag: "None" }; - } - /** - * token to be matched - * */ - const ttbm = m.remained[0]; - - if (ttbm.type == typ) { - let new_matched = m.matched.concat(ttbm); - let result : tk.Some = { - _tag: "Some", value: { - matched: new_matched, - remained: m.remained.slice(1), - ast: ([ttbm]), - } - }; - return result; - } - else { - return { _tag: "None" }; - } - } -}; +## Arguments +INPUT_FILE\tan input .clo file -/** - * type int - */ -let tInt = m1TType(tk.TokenType.INT); -let tAdd = m1TType(tk.TokenType.I_ADD); -let tMul = m1TType(tk.TokenType.I_MUL); +## Parameters +--- +--output-js\tgenerated the output middle JS file -argv.forEach((val, index) => { - console.log(`${index}=${val}`); -}); +Report bugs to: clo@kianting.info +clo home page: +` +processArgv(argv, helpDesc); /** - * like `m ==> f` in ocaml - * @param m matchee wrapped - * @param f matching function - * @returns wrapped result + * processing the passed `argv` (arguments) */ -function thenDo(m : tk.Maybe, f : Function){ - if (m._tag == "None"){ - return m; - }else{ - var a : tk.Maybe = f(m.value); - if (a._tag == "Some"){ - a.value.ast = concat(m.value.ast, a.value.ast); - } - return a; - } -} +export function processArgv(argv : any, helpDesc : string){ + let inputFile : string[] = argv['_']; + let outputJSFile : string | true = argv['output-js']; -/** - * like `f1 | f2` in regex - * @param f1 the first tried function - * @param f2 the second tried function - * @returns wrapped result - */ -function orDo(f1 : Function, f2 : Function){ - return (x : TokenMatcheePair) =>{ - let res1 : tk.Maybe = f1(x); - if (res1._tag == "Some"){ - return res1; - }else{ - let res2 : tk.Maybe = f2(x); - return res2; - } - } - -} - -let midfix = (f : Function, signal? : string) => (x : TokenMatcheePair)=>{ - var a = f(x); - if (a._tag == "Some"){ - let ast_head : tkTree[] = slice(a.value.ast,0,a.value.ast.length-3); - let ast_tail : tkTree[] = slice(a.value.ast,a.value.ast.length-3); - let new_ast = [ast_tail]; - a.value.ast = new_ast; + let NoInputFile : boolean = (inputFile.length == 0); + let NoOutputJSFile : boolean = (outputJSFile === undefined || outputJSFile == true); + let helpTriggered : boolean = argv['help']; - console.log("+"+signal+"+"+repr(a)); - - + if (inputFile.length > 1){ + console.log("Sorry, the input file should be only one."); } - return a; -} - -/** - * - * fac1 = int MUL int - */ -//let fac1 = midfix((x : TokenMatcheePair)=> -// thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt)); - -let fac1 = (x : TokenMatcheePair) => { - let a = midfix((x : TokenMatcheePair)=> - thenDo(thenDo(thenDo(tk.toSome(x), tInt), tMul), tInt), "fac1")(x); - - return a; -} - - -/** - * - * fac2 = int MUL int - */ -let fac2 = tInt; -/** - * fac = fac1 | fac2 - */ -let fac = orDo(fac1, fac2); - - -/** - * - * expr1 = fac ADD fac - */ -let expr1 = midfix((x : TokenMatcheePair)=> - thenDo(thenDo(thenDo(tk.toSome(x), fac), tAdd), fac), "expr1"); -/** - * expr2 = fac - */ -let expr2 = fac; + /** output --help */ + if (helpTriggered || NoInputFile || NoOutputJSFile){ + console.log(helpDesc); + }else{ + fs.readFile(inputFile[0], 'utf8', (err : Error, inputText : string) => { + if (err) throw err; -/** - * expr = expr1 | expr2 - */ -let expr = orDo(expr1, expr2); + let tree = parser.inputTextToTree(inputText); + let output = parser.treeToJS(tree); + fs.writeFile(outputJSFile, output , (err : Error) => { + if (err) throw err; + }); + }); + } -let tokens = tk.tokenize("2+3*4");//tk.tokenize(argv[2]); -let tokensFiltered = tokens.filter( - (x)=>{return (x.type != tk.TokenType.NL - && x.type != tk.TokenType.SP)}); +} -let wrappedTokens : tk.Maybe = - tk.toSome({ - matched : [] , - remained : tokensFiltered, - ast : []}); -let beta = expr({ - matched : [] , - remained : tokensFiltered, - ast : []}); -console.log(repr(wrappedTokens)); -console.log(repr(beta));