如何在TatSu语法文件中使用#include?相对路径失效问题
解决TatSu中相对路径#include的解析异常问题
问题根源
你用open()读取主语法文件的文本内容再传给tatsu.compile()时,TatSu无法获取主文件的实际路径。失去正确的路径基准后,它解析相对路径的#include时会用错误的路径查找依赖文件,最终出现缺失路径组件的报错。
两种修复方法
直接传入文件路径(推荐)
无需手动读取文件内容,直接把主语法文件的完整路径传给tatsu.compile(),TatSu会自动基于这个路径解析相对路径的依赖:psr = tatsu.compile("/full/path/to/main.ebnf")手动指定主文件路径(适合需预处理内容的场景)
如果必须先读取文件内容做预处理,就通过filename参数告诉TatSu主文件的完整路径,让它以此为基准查找依赖:with open("/full/path/to/main.ebnf") as source: psr = tatsu.compile( source.read(), filename="/full/path/to/main.ebnf" )
补充说明
TatSu处理#include时,依赖主语法文件的位置计算相对路径。只传文本内容的话,它没有路径参考,会用错误的基准(比如当前工作目录的某个错误子路径)查找文件,自然找不到目标。绝对路径能正常工作,是因为它不需要依赖基准路径。
内容的提问来源于stack exchange,提问作者volferine
相关产品推荐
相关产品推荐

