从PLY迁移到SLY后,遍历集合触发AttributeError问题咨询
解决SLY Lexer中遍历集合触发"Name transition redefined"错误的问题
问题根因
SLY的Lexer元类(LexerMeta)在创建类时会扫描所有类级别的属性,不允许重复定义同名属性。你在HeroLabLexer类定义内部写的for循环,每次迭代都会把循环变量transition当作类属性来处理——第一次迭代时元类记录了transition这个属性,第二次迭代时相当于要重新定义它,直接触发了重定义的错误,这和你在循环里执行tokens.add()还是print()无关,问题出在循环变量本身被重复注册为类属性。
解决方案
把tokens的初始化逻辑移到类定义外面,先处理好完整的tokens集合,再赋值给类的tokens属性:
from transitions import transition_set, reference_set from sly import Lexer # 预先在类外处理所有transition,生成完整的tokens集合 tokens = set() for transition in transition_set: tokens.add(transition) class HeroLabLexer(Lexer): # 直接使用预先生成好的tokens集合 tokens = tokens # 后续添加你的词法规则...
补充说明
如果还有其他初始token需要添加,可以直接在类外的tokens集合里一并处理,比如:
tokens = {'OTHER_TOKEN1', 'OTHER_TOKEN2'} for transition in transition_set: tokens.add(transition)
内容的提问来源于stack exchange,提问作者Sean Duggan
相关产品推荐
相关产品推荐

