X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Findex.ts;h=44aa79282788f7f8fd28679017ceb114c49c3149;hb=c3dc58d74afa6b298d84bad90d63c027a32a954a;hp=26a690eb3b71659a119668c7e4c5f202faf04a39;hpb=d4dfd2e99f564ca880d40172687986ea3ce757f0;p=clo diff --git a/src/index.ts b/src/index.ts index 26a690e..44aa792 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,265 +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'; -import { TokenType } from "./tokenize"; -/** - * - * # 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; -} - -/**inspect the inner of the representation. */ -let repr = (x : any)=>{return util.inspect(x, {depth: null})}; -/** - * - * # TYPES - */ +var argv : any = require('minimist')(process.argv.slice(2)); - -type tkTree = string | tkTree[]; - -enum TokenKind { - Seperator, // --- - Semicolon, // ; - Number, - Op, - ExprMark, // @ - ExcapeAt, // \@ - Paren, - SpaceNL, // \s\t\n\r - Id, - Str, - Comment, // /* ooo */ -} +import * as parser from "./parser.js"; /** - * Parsing + * help for inputing `--help` parameter. */ -const lexer = p.buildLexer([ - [true, /^\d+(\.\d+)?/g, TokenKind.Number], - [true, /^\\\@/g, TokenKind.ExcapeAt], - [true, /^\/\*([^/]|\/[^*])*\*\//g, TokenKind.Comment], - [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], - [true, /^(\s|\n|\r|\t)+/g, TokenKind.SpaceNL], +export let helpDesc = +` +clo: clo INPUT_FILE --output-js OUTPUT_JS_FILE -]); +\ta little typesetter powered by TypeScript/Javascript. -/** - * - * # TEST - */ -const inputTxt= -`import a as b; /*bacourt*/ -/* ba choir -ipsum lorem*/ +## Arguments +INPUT_FILE\tan input .clo file -import you as john; +## Parameters --- +--output-js\tgenerated the output middle JS file -臺中市\\\@ - -公園 -@1+2==3; - -console.log("122");@ - -山頂 -`; - - -const PROG = p.rule(); -const SEGMENT = p.rule(); -const IMPORT = p.rule(); -const IMPORTS = p.rule(); -const SEMICOLON = p.rule(); -const EXCAPE_AT = p.rule(); -const NOT_AT_TEXT = p.rule(); -const CONTENT = p.rule(); - -let doubleMinus = { type: 'Punctuator', value: '--' }; -let doubleMinus2 = p.str('--'); -const TERM = p.rule(); - -function applySegment(input: [Token, Token[], - Token]): tkTree[]{ - let unpackedInnerExprs = input[1].map((x)=>{return x.text}); - return ["%exprs", unpackedInnerExprs]; -} - -function applySemiColon(value: Token): tkTree{ - return value.text; -} - -function applyParts(first: tkTree, - second: [Token, tkTree]):tkTree { - return ["%clo", first , second[1]]; -} - - -function applyComment(value: Token): tkTree[]{ - return [value.text]; -} +Report bugs to: clo@kianting.info +clo home page: +` -function applyImport(input: [Token,Token[], tkTree]) : tkTree{ - let importTail = input[1].map(x=>x.text); - return ["import"].concat(importTail); -}; - - -/* -function applyImportComment(input: [Token,Token[], - tkTree, Token]) : tkTree{ - let importTail = input[1].map(x=>x.text); - let comment = [input[3].text]; - return ["import"].concat(importTail).concat(comment); -};*/ - -function applyImports(input : [tkTree, tkTree[]]): tkTree{ - let resultBody = [input[0]].concat(input[1]); - let resultWrapper = ["%import", resultBody]; - return resultWrapper; -}; - - - - -function applyNotAtText(value : Token): tkTree{ - if (value.text == "\\\@"){ - return '@'; - } - else{return value.text;} -}; - -function applyText (input : tkTree): tkTree[]{ - return ["%text", input]; -}; - -function applyContent(input : tkTree[]): tkTree[]{ - return ["%content", input]; -}; - -function applySpaceNL(value : Token): tkTree{ - return value.text; -} +processArgv(argv, helpDesc); /** - * IMPORTEE: Number, Op, Paren, Id, Str, Comment, + * processing the passed `argv` (arguments) */ -let IMPORTEE = p.alt(p.tok(TokenKind.Number), - p.tok(TokenKind.Op), - p.tok(TokenKind.Paren), - p.tok(TokenKind.Id), - p.tok(TokenKind.Str), - p.tok(TokenKind.SpaceNL), - p.tok(TokenKind.Comment)); -let NOT_AT = p.alt(p.tok(TokenKind.Seperator), - p.tok(TokenKind.Semicolon), - p.tok(TokenKind.Number), - p.tok(TokenKind.ExcapeAt), - p.tok(TokenKind.Op), - p.tok(TokenKind.Paren), - p.tok(TokenKind.SpaceNL), - p.tok(TokenKind.Id), - p.tok(TokenKind.Str), - p.tok(TokenKind.Comment), - ); +export function processArgv(argv : any, helpDesc : string){ + let inputFile : string[] = argv['_']; + let outputJSFile : string | true = argv['output-js']; -/** - * PROG : IMPORTS '---' CONTENT; - */ -PROG.setPattern( - p.lrec_sc(IMPORTS, p.seq(p.str('---'), CONTENT), applyParts) + let NoInputFile : boolean = (inputFile.length == 0); + let NoOutputJSFile : boolean = (outputJSFile === undefined || outputJSFile == true); + let helpTriggered : boolean = argv['help']; -) - -/** - * NOT_AT_TEXT : NOT_AT - */ -NOT_AT_TEXT.setPattern( - p.apply(NOT_AT, applyNotAtText) -); - -IMPORTS.setPattern( - p.apply( p.seq(IMPORT, p.rep(IMPORT)), applyImports) -); + if (inputFile.length > 1){ + console.log("Sorry, the input file should be only one."); + } -/** - * IMPORT : - * 'import' IMPORTEE* SEMICOLON | - * COMMENT | - */ -IMPORT.setPattern( - p.alt( - p.apply(p.seq(p.str('import'), p.rep_sc(IMPORTEE), SEMICOLON), - applyImport), - p.apply(p.tok(TokenKind.Comment), applyComment), - p.apply(p.tok(TokenKind.SpaceNL), applySpaceNL) + /** output --help */ + if (helpTriggered || NoInputFile || NoOutputJSFile){ + console.log(helpDesc); + }else{ + fs.readFile(inputFile[0], 'utf8', (err : Error, inputText : string) => { + if (err) throw err; - ) -); + let tree = parser.inputTextToTree(inputText); -/** - * SEMICOLON : ';'; - */ -SEMICOLON.setPattern( - p.apply(p.tok(TokenKind.Semicolon), applySemiColon) -); + let output = parser.treeToJS(tree); + fs.writeFile(outputJSFile, output , (err : Error) => { + if (err) throw err; + }); + }); + } -/** - * SEGMENT : '@' NOT_AT* '@' | - * (NOT_AT_TEXT | EXCAPE_AT)* - */ -SEGMENT.setPattern( - p.alt( - p.apply(p.rep_sc(NOT_AT_TEXT), applyText), - p.apply(p.seq(p.str('@'), p.rep(NOT_AT), p.str('@')), applySegment), - ) -); - -/** - * CONTENT : SEGMENT* - */ -CONTENT.setPattern( - p.apply(p.rep(SEGMENT), applyContent) -); +} -let tree = p.expectSingleResult(p.expectEOF(PROG.parse(lexer.parse(inputTxt)))); -console.log("RESULT="+tkTreeToSExp(tree));