如何修改代码消除PetitParser中的"References cannot be parsed"错误?
解决"Unsupported operation: References cannot be parsed"错误
问题原因
这个问题我之前也碰到过,本质是对PetitParser里ref()的用途理解偏差导致的——它是专门用来创建循环依赖的延迟引用解析器的,本身并不是一个可以直接执行解析逻辑的完整解析器。当你直接调用tab().accept(tabChar)时,这个引用还没有绑定到实际的token解析器实例,所以库会抛出这个不支持的操作错误。
修复方案
根据你的场景(解析制表符的简单token,没有循环依赖),最直接的修复是去掉ref(),直接返回token解析器实例:
static const String tabChar = '\u0009'; Parser tab() => token(tabChar); // 直接创建并返回token解析器 expect(tab().accept(tabChar), isTrue);
如果你的实际场景中存在循环依赖(比如递归语法结构),确实需要用到ref(),那你需要确保引用在使用前被正确绑定/解析:
static const String tabChar = '\u0009'; // 先创建引用 final tabRef = ref(token, tabChar); Parser tab() => tabRef; // 在使用前确保引用被解析(比如在语法初始化阶段) tabRef.resolve(); expect(tab().accept(tabChar), isTrue);
补充说明
ref()的设计初衷是处理类似表达式语法的递归场景:比如expr解析器引用term,而term又反过来引用expr,这时候需要延迟解析来避免初始化顺序问题。但对于像制表符这种简单的单一token解析,完全不需要用到延迟引用,直接实例化token解析器就足够了。
内容的提问来源于stack exchange,提问作者Günter Zöchbauer
相关产品推荐
相关产品推荐

