ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PRQL 语法高亮生态全景指南:grammars 目录中的编辑器语法定义、安装与实现原理

PRQL 语法高亮生态全景指南:grammars 目录中的编辑器语法定义、安装与实现原理 后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载PRQLPipelined Relational Query Language作为一种面向数据转换的现代查询语言其语法高亮支持覆盖了从 GUI 编辑器到终端编辑器的庞大生态。本文以仓库根目录下的 grammars/README.md 为核心索引系统梳理 PRQL 在各编辑器中的语法定义文件位置、安装方式与底层实现要点并深入源码解释这些语法定义如何与 PRQL 词法分析器保持同步。读完本文你将掌握在 CotEditor、GtkSourceView、KSyntaxHighlighting、Emacs、nano、CodeMirrorLezer、Raku 等环境中启用 PRQL 语法高亮的完整方法并理解高亮规则的词法依据。一、总体设计一份语言多套语法定义PRQL 的语法定义并非集中存放在单一文件中而是分散在代码库各处如 grammars/README.md 所述由根目录的grammars/目录统一索引。这种设计的目标很明确让 PRQL 在任何主流编辑器中都获得与语言能力相匹配的高亮体验而不是只服务某一两个编辑器。从维护模式上这些语法定义可分为两大类仓库内直接维护语法文件就放在grammars/各子目录中随 PRQL 主仓库一起演进包括 CotEditor、GtkSourceView、KSyntaxHighlighting、Emacs、nano、prql-lezerCodeMirror、Raku。上游/外部维护语法文件已合入对应编辑器或其插件生态的上游仓库PRQL 侧只记录支持状态与位置包括 Ace、chroma、Helix、Kakoune、micro、Sublime Text、TextMateVS Code 扩展、MonarchMonaco/Playground、Pygments、TEA、Tree-Sitter、vim/Neovim以及 Handlebars 高亮脚本。一个值得注意的细节是语法定义之间并非各自为政。多份语法文件如 CotEditor 的PRQL.yaml与 GtkSourceView 的prql.lang都在注释中明确写着 Keep in sync with the lexerskeywordparser指向 prqlc/prqlc-parser/src/lexer/mod.rs。也就是说关键词集合的权威来源是编译器前端的词法分析器编辑器语法文件只是它的镜像。这是理解后续所有规则清单的一把钥匙。二、仓库内维护的语法定义详解1. CotEditormacOS 文本编辑器grammars/CotEditor/PRQL.yamlCotEditor 是 macOS 平台的原生文本编辑器其语法样式文件采用 YAML 格式核心文件为 grammars/CotEditor/PRQL.yaml配套说明见 grammars/CotEditor/README.md。安装步骤摘自 README打开 CotEditor 的Preferences Format偏好设置 格式。在样式列表下方的齿轮图标菜单中选择Import…导入。选择仓库中的PRQL.yaml文件即可。语法文件结构解析该 YAML 以kind: code声明为代码类型并通过extensions声明关联.prql扩展名。其高亮分类体系可以看作是词汇表驱动的主要分组如下YAML 字段作用内容要点attributes装饰器高亮正则{\w(\w)?}对应 PRQL 的{...}属性语法keywords语言关键字转换算子aggregate、derive、filter、from、group、join、select、sort、take、window语言级关键字case、let、module、prql、into、type、internal、func、import、enumcommands函数/命令聚合类abs、any、average、concat_array、count、every、min、max、stddev、sum文件读取read_csv、read_json、read_parquet、from_text列表类all、map、zip文本类lower、upper窗口类lead、lag、first、last、rank、rank_dense、row_numbertypes数据类型bool、float、int、int8、int16、int32、int64、time、timestamp、text、date以及内置对象mathvalues特殊值true、false、nullnumbers数字字面量十进制含科学计数法与j/l后缀、二进制\b0b[01][01_]*l?、八进制\b0o[0-7][0-7_]*l?、十六进制\b0x[0-9a-f][0-9a-f_]*l?均忽略大小写strings字符串单/双引号、三引号、、带前缀的\b(r|f|s|)[]对应 PRQL 的 r-字符串、f-字符串、s-字符串、反引号commentDelimiters注释行注释定界符#可以看到这份文件几乎把 PRQL 词法层的关键字、类型、字面量规则完整映射了一遍是其尽可能提供语法所支持的良好体验理念的直接体现。2. GtkSourceViewGNOME 生态grammars/GtkSourceView/prql.langGtkSourceView 是 GNOME 平台广泛使用的语法高亮组件被 GNOME Text Editor、GNOME Builder 等编辑器/IDE 采用语法文件见 grammars/GtkSourceView/prql.lang说明见 grammars/GtkSourceView/README.md。安装方式README 提供两条路径系统级安装将语法文件复制到/usr/share/gtksourceview-5/language-specs/用户级安装将语法文件复制到~/.local/share/gtksourceview-5/language-specs/注意README 中文字描述为prql.xml但仓库内实际文件名为prql.lang。按 GtkSourceView 的惯例语言文件需要以language id命名因此安装时请以仓库中实际存在的 prql.lang 为准。嵌入自有 GTK 应用如果你在自己的 GTK 程序中基于GtkSourceView组件开发需要把语言文件注册进LanguageManager再将其设置到Buffer上对应 GtkSourceView 5 的GtkSourceLanguageManager与GtkSourceBuffer.set_languageAPI。XML 结构要点文件头部声明了language idprql、namePRQL、version2.0并定义了三种 MIME 类型application/x.prql、application/prs.prql、application/vnd.prql与*.prqlglob 匹配。高亮上下文context体系非常完整值得注意的实现细节包括样式映射所有样式都映射到 GtkSourceView 的默认样式主题如def:keyword、def:string、def:type、def:decimal、def:floating-point、def:base-n-integer、def:error等从而自动适配浅色/深色主题。字符串家族覆盖双引号、单引号、三引号/以及 PRQL 特有的前缀字符串——f.../f...f-字符串{}内嵌套 PRQL 表达式见f-string-curly-braces上下文、r.../r...r-字符串、s.../s...s-字符串。转义字符支持\\b\f\n\r\t、Unicode 转义\u{hhhhhh}与十六进制转义\xhh。安全防护专门定义了unicode-bdi上下文匹配\u202A等双向文本控制字符并映射为def:error样式防止双向文本欺骗bidi spoofing注入同时用illegal-string上下文标记不带前缀的裸引号。数字与时间维度整数、浮点数含指数、二进制0b、八进制0o、十六进制0x均有独立正则dimension上下文则为数字附加时间单位关键字microseconds到years。函数分组聚合函数any、average、concat_array、count、every、max|min、stddev、sum、文件读取read_csv、read_json、read_parquet、列表函数all、map、zip、_eq、_is_null、文本函数contains、ends_with、extract、length、lower、ltrim、replace、rtrim、starts_with、trim、upper、窗口函数lag|lead、first|last、rank、rank_dense、row_number、日期函数now、to_text、diff、trunc、数学函数abs、acos、asin、atan、ceil、cos、degrees、exp、floor、ln、log、log10、pi、pow、radians、round、sin、sqrt、tan。这份文件在仓库中是对 PRQL 词法覆盖最详尽的一份甚至包含了#!块注释支持block-comment上下文。3. KSyntaxHighlightingKDE 生态grammars/KSyntaxHighlighting/prql.xmlKSyntaxHighlighting 是 KDE 的语法高亮框架被 Kate、KWrite、KDevelop 等 Qt 编辑器/IDE 使用语法文件为 grammars/KSyntaxHighlighting/prql.xml安装说明见 grammars/KSyntaxHighlighting/README.md。各平台安装路径README 提供的完整表格系统/场景路径本地用户Linux$HOME/.local/share/org.kde.syntax-highlighting/syntax/Flatpak 打包应用$HOME/.var/app/PACKAGE_NAME/data/org.kde.syntax-highlighting/syntax/Snap 打包应用$HOME/snap/PACKAGE_NAME/current/.local/share/org.kde.syntax-highlighting/syntax/Windows%USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax\macOS$HOME/Library/Application Support/org.kde.syntax-highlighting/syntax/其中 Flatpak 与 Snap 场景下的PACKAGE_NAME形如org.kde.kate、org.kde.kwrite或org.kde.kdevelop即对应应用包名。安装时把prql.xml复制到上述目录后重启编辑器即可生效。4. GNU Emacsgrammars/emacs/prql-mode.elEmacs 的 PRQL 高亮以 major mode 形式提供文件为 grammars/emacs/prql-mode.el说明见 grammars/emacs/README.md。安装步骤摘自 README将prql-mode.el复制到~/.emacs.d/custom-modes/目录。在~/.emacs.d/init.el中添加如下配置(add-to-list load-path ~/.emacs.d/custom-modes/) (require prql-mode) (add-to-list auto-mode-alist (\\.prql\\ . prql-mode))这样打开.prql文件时 Emacs 会自动切换到prql-mode并启用高亮。若使用如use-package等配置框架也可将上述逻辑包在对应的配置块中。5. GNU nanogrammars/nano/prql.nanorcnano 的语法文件为 grammars/nano/prql.nanorc说明见 grammars/nano/README.md。安装方式将prql.nanorc放到~/.nano/目录然后在.nanorc中 include 该文件include ~/.nano/prql.nanorcREADME 还给出了快捷命令echo include ~/.nano/prql.nanorc ~/.nanorc规则要点来自 nanorc 文件本身文件首行以syntax prql \.prql$声明匹配规则并设置magic PRQL script与行注释comment #。配色方案包括类型绿色int(8|16|32|64|128)?、float(32|64)?、bool、text、date、time、timestamp关键字黄色let、into、case、prql、type、module、internal、func、import、enum转换算子亮青色aggregate、derive、filter、from、group、join、select、sort、take、window特殊值亮品红false、null、true、this、that装饰器青色{到}字符串单/双引号与f/r/s前缀字符串、三引号字符串转义青柠色反斜杠转义与\u{...}/\N{...}Unicode 转义注释灰色与TODO/FIXME 提醒亮白黄以及行尾空白高亮nano 这份文件还提供了 PRQL 的两种官方注释形式支持#行注释。6. prql-lezerCodeMirror / Lezergrammars/prql-lezer/Lezer 是 CodeMirror 6 的解析系统。PRQL 的 Lezer 语法位于 grammars/prql-lezer/核心文件是 grammars/prql-lezer/src/prql.grammar一个 Lezer 文法定义文件与 grammars/prql-lezer/src/highlight.js说明见 grammars/prql-lezer/README.md。项目状态README 说明该文法大体上已功能完整largely fully-functioninggrammar 文件中仍留有少量 TODO目前仓库内还没有配套的 JS 发布机制尚未发布到任何包管理器后续可能独立成库。使用与开发安装依赖npm install构建npm run build测试npm run test测试覆盖test/目录下的测试按 PRQL 语法主题拆分包括arithmetics.txt、arrays.txt、datetime.txt、full_queries.txt、identifiers.txt、misc.txt、numbers.txt、operators.txt、strings.txt、tuples.txt配合 test-prql.js 与 test-highlight.js 分别验证解析树与高亮标记。为什么重要CodeMirror 语法是若干下游工具的前置依赖README 明确指出 Jupyter 的 PRQL 语法高亮就依赖它对应 PRQL 生态中的 Jupyter 集成需求。交互式开发时README 建议使用 Lezer Playground粘贴示例查询 → 粘贴当前 grammar → 修复问题 → 把 grammar 复制回仓库形成快速迭代闭环。7. Rakugrammars/raku/Raku 语言本身以 grammar 机制著称PRQL 为其提供了一份真正的 Raku Grammar 实现核心文件为 grammars/raku/lib/prql.rakumod说明见 grammars/raku/README.md。基本用法摘自 READMEuse lib .; use prql; say PRQL.parse(from employees); say PRQL.parsefile(employees.prql);安装从源码安装运行zef install .。测试体系测试位于 grammars/raku/t/按语法主题拆分arithmetics、arrays、datetime、full_queries、identifiers、misc、numbers、operators、strings、tuples可单独运行raku t/arithmetics.rakutest全量运行需先通过zef安装App::Prove6然后执行zef install App::Prove6 prove6 --lib t/测试的独特之处Raku 测试不仅断言查询能被解析还断言语法树的结构形状。例如parses-to filter 10 * 10, statement(pipeline-statement(pipeline(call-expression(identifier«filter»,test(test-inner(binary-test(expression(number(integer«10»)),arith-op«*»,expression(number(integer«10»)))))))));这里的parses-to来自 grammars/raku/t/lib/PRQLTest.rakumod它把Match对象渲染成rule(child,child)形式的字符串叶子捕获的文本放在«…»中失败时会按缩进逐行打印两侧形状以便对比。编写断言前可先用shape函数查看任意查询的树形raku -I lib -I t/lib -e use PRQLTest; use prql; say shape(PRQL.parse(filter 1 1))三、上游维护与其他位置的语法定义除grammars/目录外PRQL 的高亮生态还延伸到了多个上游项目与仓库内的其他位置均为 grammars/README.md 记录的支持状态编辑器/框架支持方式语法所在位置Ace支持语法已合入上游Ace 仓库中的prql_highlight_rules.js另有官方 demo 可在线体验chromaGo支持语法已合入上游chroma 仓库lexers/embedded/prql.xml被 Hugo 静态站点生成器使用可在 chroma playground 试玩Handlebars仓库内维护两份当前有重复书book用 web/book/highlight-prql.js网站book 与 playground 之外用 web/website/themes/prql-theme/static/plugins/highlight/prql.jsHelix支持语法已合入上游Helix 仓库runtime/queries/prqlKakoune支持语法已合入上游Kakoune 仓库rc/filetype/prql.kakmicro支持语法已合入上游micro 仓库runtime/syntax/prql.yamlSublime Text独立仓库维护位于sublime-prql仓库TextMateVS Code 扩展独立仓库维护prql-vscode仓库的syntaxes/prql.tmLanguage.jsonMonarchMonaco仓库内维护web/playground/src/workbench/prql-syntax.js供 PRQL Playground 的 Monaco 编辑器使用Pygments支持语法已合入上游Pygments 仓库pygments/lexers/prql.py被 Wikipedia、Bitbucket、Sphinx 等使用可在 Pygments 官方 demo 验证TEA支持语法已合入上游TEA 仓库hls/prql.xmlTree-Sitter独立仓库维护位于tree-sitter-prql仓库供 Neovim 与 Helix 使用vim支持语法已合入上游vim 仓库runtime/syntax/prql.vimNeovim 同样支持语法同样在上游其中 Monarch 语法值得特别留意它直接服务于仓库内的 Playgroundweb/playground/如果你希望在浏览器端体验 PRQL 并研究其高亮 token 划分web/playground/src/workbench/prql-syntax.js 是最直接的参考实现。四、共同的词法基石语法文件如何与 lexer 保持同步如果同时打开上述多份语法文件会发现关键词清单高度一致。这不是巧合——多份文件都带有指向 prqlc/prqlc-parser/src/lexer/mod.rs 的注释如 CotEditor 的PRQL.yaml与 GtkSourceView 的prql.lang均写着 Keep in sync with the lexerskeywordparser。这意味着权威来源是编译器前端的词法分析器prqlc-parsercrate 的 lexer 模块PRQL 关键字集合以 lexer 的实现为准编辑器语法文件是它的下游镜像新增关键字时各语法文件需要同步更新。综合各语法文件可以归纳出 PRQL 高亮背后的统一词法约定语言关键字let、into、case、prql、type、module、internal、func、import、enum转换算子transformsaggregate、derive、filter、from、group、join、select、sort、take、window数据类型bool、float、int及int8/int16/int32/int64、text、date、time、timestamp特殊值true、false、null字符串前缀ff-字符串可内嵌{}表达式、rr-字符串原生文本、ss-字符串直接生成 SQL三引号用于多行字符串数字字面量十进制支持科学计数法、二进制0b、八进制0o、十六进制0x并支持下划线分隔与后缀注释#行注释GtkSourceView 版本还支持#!块注释装饰器{...}语法CotEditor 与 nano 均有对应高亮如果你准备为某个尚未覆盖的编辑器编写 PRQL 语法文件最稳妥的做法就是以上述清单为关键词基准参考 GtkSourceView 的 prql.lang覆盖最全作为规则模板再对照 lexer 源码确认细节。五、选择与部署建议按使用场景选择终端重度用户nano~/.nano/prql.nanorc、vim/Neovim上游已内置、Helix上游已内置、Kakoune上游已内置、micro上游已内置、Emacsprql-mode.el均可用。GUI 编辑器用户macOS 选 CotEditorPRQL.yamlGNOME 系选 GtkSourceViewprql.langKDE 系选 KSyntaxHighlightingprql.xmlVS Code 用户使用官方扩展TextMate 语法在扩展仓库内。浏览器/文档场景Playground 使用 Monarch 语法prql-syntax.jsbook 与网站使用 Handlebars 高亮脚本Hugo 站点可用 chroma。程序化高亮Python 用 PygmentsGo 用 chromaRaku 项目可直接引用 prql.rakumod。部署后的验证建议安装完成后打开一个包含转换算子如from、select、filter、关键字如let、不同类型字面量十进制、0x十六进制、0b二进制以及 f-字符串的.prql示例文件观察各 token 是否按预期着色若某些类别未区分优先检查语法文件版本与 prqlc/prqlc-parser/src/lexer/mod.rs 中的关键字集合是否一致。六、总结PRQL 的语法高亮生态遵循以 lexer 为词法权威、以多格式语法文件为镜像的清晰架构grammars/README.md 作为索引grammars/目录维护了 CotEditor、GtkSourceView、KSyntaxHighlighting、Emacs、nano、Lezer/CodeMirror、Raku 七套可直接使用的定义Ace、chroma、Helix、Kakoune、micro、Pygments、vim/Neovim、TEA 等则通过上游合入获得支持Handlebars、Monarch 等服务于 PRQL 官方文档站与 Playground。任何高亮体验的不足都可以按 grammars/README.md 的说明通过 GitHub issue 反馈给 PRQL 项目从而让这一尽可能提供语法所支持的良好体验的目标持续演进。赞分享后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载相关推荐PRQL 语法高亮生态解析从编辑器语法定义到词法分析器的一致性维护PRQL 语法高亮生态解析从编辑器语法定义到词法分析器的一致性维护 PRQLPipelined Relational Query Language是一个用后端PRQL 语言在 GtkSourceView 中的语法高亮prql.lang 定义文件安装、嵌入与实现解析PRQL 语言在 GtkSourceView 中的语法高亮prql.lang 定义文件安装、嵌入与实现解析 PRQLPipelined Relational后端PRQL 语法高亮在 GNU nano 中的安装与配置指南PRQL 语法高亮在 GNU nano 中的安装与配置指南 本篇技术指南围绕 PRQL 仓库中 grammars/nano/ https://link.gitc后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表