# prism4cj
**Repository Path**: hzhqy/prism4cj
## Basic Information
- **Project Name**: prism4cj
- **Description**: prism4cj upgrade to 0.58.18
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-02-10
- **Last Updated**: 2025-02-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
prism4cj
## 介绍
prism4cj 为以后的处理提供任意语法的标记化策略。
### 特性
- 🚀 支持标记不同类型的关键词
- 🚀 支持不同语言的解析器/分发器
- 🚀 支持预定义语法解析器
### 架构
```mermaid
flowchart LR
md[/Markdown围栏代码Text/] -->grammar(语言查询)
grammar --> tokenize(代码及grammar解析)
tokenize --> renderer(Renderer渲染)
renderer <--> visitor[[Visitor遍历]]
renderer --> res[/渲染结果/]
```
### 源码目录
```shell
├── doc
├── src
├── languages 语言包
├── prism_brainfuck.cj brainfuck 语言规则
├── prism_c.cj c 语言规则
├── prism_clike.cj clike 类语言规则
├── prism_clojure.cj clojure 类语言规则
├── prism_cpp.cj cpp 类语言规则
├── prism_csharp.cj csharp 语言规则
├── prism_css_extras.cj css_extras 语言规则
├── prism_css.cj css 类语言规则
├── prism_dart.cj dart 类语言规则
├── prism_git.cj git 类语言规则
├── prism_go.cj go 语言规则
├── prism_groovy.cj groovy 语言规则
├── prism_java.cj java 类语言规则
├── prism_javascript.cj javascript 类语言规则
├── prism_json.cj json 类语言规则
├── prism_kotlin.cj kotlin 语言规则
├── prism_latex.cj latex 语言规则
├── prism_makefile.cj makefile 类语言规则
├── prism_markdown.cj markdown 类语言规则
├── prism_markup.cj markup 类语言规则
├── prism_python.cj python 类语言规则
├── prism_scala.cj scala 语言规则
├── prism_sql.cj sql 类语言规则
├── prism_swift.cj swift 类语言规则
├── prism_yaml.cj yaml 类语言规则
├── prism_cangjie.cj cangjie 类语言规则
├── prism 主函数包
├── cloner.cj cloner 克隆类
├── grammar_locator.cj 语法加载器类
├── grammar_utils.cj 语法工具类
├── grammar.cj 语法类
├── node.cj 节点类
├── pattern.cj 模式类
├── prism_tostring.cj 自定义 toString 工具类
├── prism.cj 核心类
├── token.cj 令牌类
├── visitor.cj visitor 类
├── grammar_locator_grammar_utils.cj grammar加载器工具类
└── test
├── DOC 文档示例
├── HLT HLT用例
└── LLT LLT自测用例
├── CHANGELOG.md
├── gitee_gate.cfg
├── LICENSE
├── module.json
├── README.md
├── README.OpenSource
```
- `DOC` 存放本库使用文档
- `src` 是库源码目录
- `test` 是存放测试用例的文件夹,含有 DOC 功能示例、FUZZ 测试用例、HLT 测试用例、LLT 自测用例
### 接口说明
主要是核心类和成员函数说明,详情见 [API](./doc/feature_api.md)
##
使用说明
### 编译构建
#### linux环境编译
编译描述和具体shell命令
```shell
cjpm build
```
#### Windows环境编译
编译描述和具体cmd命令
```cmd
cjpm build
```
### 执行用例
编译用例并执行,步骤如下:
#### 1. 进入 test/ 目录下创建 tmp 文件夹,然后编译测试用例
```shell
cd test/
mkdir tmp
cjc -O2 --import-path ../target/release/prism4cj -L ../target/release/prism4cj -l prism4cj.languages -l prism4cj.prism -l prism4cj LLT/testC.cj LLT/testUtils.cj -o tmp/testC.cj.out --test
```
##### 1.1 具体说明
- cjc命令, -O2表示开启优化
```shell
cjc -O2
```
\
-l prism4cj_prism4cj.languages -l prism4cj_prism4cj
- --import-path 导入 prism4cj 库编译出来的库文件地址, 注意地址最后有".."
- xxx 代表自己的工作目录,应替换成自己的实际工作目录
- -L 导入库文件的完整路径
- 导入多个库,每个库都需要--import-path和 -L
```shell
--import-path xxxxx/target/release -L xxxxx/target/release/prism4cj -l -l prism4cj_prism -l prism4cj_languages -l prism4cj_prism4cj
```
- -l 要导入的具体的包, 用"库名_包名",一般库文件生成时是"lib库名_包名.后缀"的格式
- 导入一个库中有多个包时,用多个 -l
- 测试用例的完整路径和用例中引入文件的完整路径
- -o 用例编译后输出的位置和名称, .out结尾, 一般使用"用例名称.out"
- --test 用例编译命令结尾
```shell
LLT/testC.cj LLT/testUtils.cj -o tmp/testC.cj.out --test
```
#### 2. 把编译好的文件复制到 .out 文件下(test/tmp/)
- target/release/prism4cj 目录中的文件都复制到 .out 文件位置(test/tmp/ 中)
#### 3. 进入到.out文件位置,执行用例
- 进入到.out文件位置执行用例
```shell
cd test/tmp
set cangjie_test_path=xxxx
```
- windows系统打开cmd,输入.out文件完整名称即可执行
- Linux系统使用 ./.out文件完整名称
### 功能示例
#### c 语言关键词标记示例
```cangjie
import std.unittest.*
import std.unittest.testmacro.*
import std.fs.*
import std.collection.*
import prism4cj.prism.*
import prism4cj.prism4cj.GrammarLocatorGrammarUtils
main(): Int64 {
var test = TestCReadme()
let res = test.asTestSuite().runTests()
let fail = res.failedCount + res.errorCount
if (fail == 0) {
return 0
}
return 1
}
@Test
public class TestCReadme {
@TestCase
public func test01(): Unit {
let fileArr: Collection = TestUtils.testFiles("c")
var prism: Prism = Prism(GrammarLocatorGrammarUtils())
var c: Case
for (file in fileArr) {
c = TestUtils.readCase(file)
match (prism.grammar("c")) {
case Some(v) => TestUtils.assertCase(c, prism.tokenize(c.input, v))
case None => ()
}
}
}
}
```
执行结果如下:
```shell
0
```
## 约束与限制
在下述版本验证通过:
```shell
Cangjie Version: 0.58.18
```
## 开源协议
本项目基于 [Apache License 2.0](https://gitcode.com/Cangjie-TPC/prism4cj/blob/develop/LICENSE) ,请自由的享受和参与开源。
##
参与贡献
欢迎给我们提交 PR,欢迎给我们提交 issue,欢迎参与任何形式的贡献。