# vsnlang **Repository Path**: vsluosir/vsnlang ## Basic Information - **Project Name**: vsnlang - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-10 - **Last Updated**: 2021-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vsn标记语言 ## 目标实现: * vsn向任意类型文本格式进行转换 * vsn生成思维导图,流程图等 * vsn生成应用 * vsn生成AI行为树 ## 使用 vsnotecode会以yaml配置文件所在目录为工作目录 ```shell vsnotecode [yaml配置文件绝对路径] [输入文件路径] ``` ### 获取父节点 在对树结构进行解析的时候使用context识别当前结点的父节点,因为只有在解析过程中才能确定父节点 topic中的parentID只是起到保存数据的作用 ## yml配置 配置中的目录路径都是当前工作目录的相对路径 (yaml配置文件所在目录为工作目录) ```yaml vsnConfig: parser: libs: markers: marker定义文件目录 processors: 处理器解析规则定义目录 annotations: 标注与处理器的关联关系以及参数定义文件位置 encodeing: 定义文件格式 input: filename: 输入文件正则字符串 # 比如:ex: '\w+\.vsn', 可以是相对路径 encodeing: 输入文件格式 output: filename: 输出文件正则字符串 # 比如:ex: '$$.out', $$会被替换为输入文件袋文件名(不包含扩展名) encodeing: 输出文件格式 ``` ## 定义文件 ### processor处理函数: * use(上一次处理器的结果: `VVsnObject类型`, arg: `(string) => 实参参数`), 全局this指针指向当前的处理器对象, use的this指针指向当前上下文 * useAfter(上一次处理器的结果: `VVsnObject类型`, 子结点的结果: `VVsnObject[]类型`, arg: (string) => 实参参数), 全局this指针指向当前的处理器对象, useAfter的this指针指向当前上下文 ```javascript const processor = this async function use(last, arg) { const res = (await arg("str").process()).result().rawText() console.log("before: ", res) // 子节点解析前 resolve() // 结尾一定要加上resolve将控制权进行转移, 否则不会执行后续 } async function useAfter(last, subResults, arg) { const res = (await arg("str").process()).result().rawText() console.log("after: ", res) // 子节点解析后 return (`${res} : ${last.rawText()}`) // 或者使用return返回结果 } ``` ### marker定义文件 use(参数: `(string) => 实参参数`), 全局this指针指向当前的marker对象, use的this指针指向当前上下文 ```javascript const marker = this async function use(arg) { const ctx = this // 具有副作用的marker应当在副作用代码位置防止二次执行 if (marker.processed() < 1) { const src = (await this.api().readFile(arg("path").process(ctx)).result().rawText()) this.api().parse(src).map(f => this.topic().addChild(f)) } return "[" + (await marker.name()).rawText(null, 2) + "]" + (await arg('a').process(this)).result().rawText() + (await arg('b').process(this)).result().rawText() } use.params = ['a', 'b'] ``` * 注意: 若不在processor定义中调用该marker的process,就不会执行该marker