使用SLY构建解释器时Parser无法识别语法规则求助
SLY Parser无法匹配语法规则的排查方案
关键排查点
- 规则方法命名规范
SLY仅识别以_开头的方法作为语法规则,比如定义constant规则必须写成def _constant(self, p):,而非def constant(self, p):,这是最常见的错误点。 - Token名称一致性
确认Lexer中定义的Token名称(如NUMBER、STRING)与Parser规则中的引用完全一致,SLY对Token名称大小写敏感,拼写错误会导致规则无法匹配。 - 调试模式定位问题
初始化Parser时开启调试:parser = Parser(debug=True),运行后会输出Token流、规则匹配尝试过程及失败原因,能直接定位是Token未传入还是规则逻辑问题。 - Lexer与Parser的衔接
主程序中必须先通过Lexer生成Token序列,再传入Parser解析,示例代码:
禁止直接将原始字符串传给Parser的lexer = Lexer() parser = Parser() token_stream = lexer.tokenize(your_input_code) parse_result = parser.parse(token_stream)parse方法。 - 空规则干扰排查
若Parser中存在空规则(如def _empty(self, p):),其优先级可能高于目标规则,导致优先匹配空规则。可暂时注释所有空规则,仅保留constant规则测试。 - 优先级装饰器影响
若设置了@precedence装饰器,可能打乱规则匹配顺序,可先移除该装饰器,测试基础规则是否正常工作。
示例修正
假设原constant规则写法错误,修正后:
# 正确的规则定义 def _constant(self, p): p[0] = Constant(p[1])
确保Lexer对应Token生成正确:
@_(r'\d+') def NUMBER(self, t): t.value = int(t.value) return t
内容的提问来源于stack exchange,提问作者Ivan Lo Greco
相关产品推荐
相关产品推荐

