使用Tatsu解析#字符时出现异常,求教转义解决方法
Tatsu解析
#字符触发异常的解决办法 问题原因
Tatsu默认将#视为行注释起始符,即便你指定了//作为行注释,若语法配置有误(比如错误设置块注释规则),默认的#行注释规则仍会生效,导致输入的#被当作注释过滤掉,解析器因此无法匹配语法中定义的'#' token。
解决方案
1. 修正语法注释配置
移除错误的块注释设置(@@comments :: //,//是行注释格式,不适合作为块注释规则),仅保留正确的行注释配置,覆盖默认的#行注释:
import tatsu grammar = r''' @@eol_comments :: // # 仅将//作为行注释,覆盖默认的#规则 start = '#' ; ''' print(tatsu.__version__) parser = tatsu.compile(grammar) ast = parser.parse('#', trace=True)
2. 需保留默认注释规则时,转义#字符
如果必须保留#作为行注释,同时要解析#字符,可在输入中用\转义,并在语法中匹配转义后的字符:
语法修改为:
grammar = r''' @@eol_comments :: // | # // 保留两种行注释规则 start = '\#' ; # 匹配转义后的# '''
输入改为解析转义后的字符:
ast = parser.parse(r'\#', trace=True)
验证结果
使用第一种方案后,解析器会正确识别输入的#为普通字符而非注释,成功匹配语法规则,不再抛出FailedToken异常。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

