treesitter - 保姆,如何正确使用“包罗万象”的规则?
问题描述
我有这样的语法:
terminator = '\n';
module.exports = grammar({
name: 'sciname',
rules: {
source_file: ($) => repeat($._sci_name),
_sci_name: ($) => seq($.uninomial, optional($.tail), terminator),
_uninomial: ($) => /[A-Z][a-z]+/,
uninomial: ($) => choice($._uninomial, seq($.genus, $.subgenus)),
genus: ($) => $._uninomial,
subgenus: ($) => seq('(', $._uninomial, ')'),
tail: ($) => /.+/,
},
});
tail
规则假设捕获之后的任何东西uninomial
。但是我在这个测试中遇到了麻烦:
=====================
Subgenus
=====================
Bubo (Bubo)
---------------------
(source_file (uninomial (genus) (subgenus)))
生产:
(source_file (uninomial) (tail))
代替
(source_file (uninomial (genus) (subgenus)))
更改优先级似乎不会影响此行为。有没有办法制定一个“包罗万象”的规则,比如tail
只有在所有其他以前的规则都失败的情况下才参与?
解决方案
根据https://github.com/tree-sitter/tree-sitter/discussions/1407
阿林克写道:
尝试使用以下 token(prec(-1, ...)) 构造为您的尾部分配较低的词法分析器优先级:
tail: ($) => token(prec(-1, /[^\s]+/)),
推荐阅读
- node.js - 无法读取未定义节点 Js Post 请求的属性
- xml - 错误:XML 文档在最终结束标记之后需要开始标记
- swift - iOS SwiftUI:如何在视图中检测 UITapGesture 的位置?
- reactjs - 如何将 Stockfish.js 添加到我的 react (+ typescript) 应用程序中?
- javascript - 网络音频:播放立体声(2 声道)mp3,因此只能在左耳听到通道 1,在右耳听到通道 2
- python - 从数据框创建 json 文件
- azure-devops - Azure Devops 拉取请求中的 Sonarcloud 门卡在等待状态
- javascript - NEXT_LOCALE cookie 被忽略。难道我做错了什么?
- serverless - 无法在 Azure Purview 上开始扫描 Azure Synapse Analytics 无服务器池
- python - Python asyncio 取消未等待的协程