由于某种原因,TatSu往往忽略方括号字符,无论是[],还是两者的组合,并在不同的时间识别它们,我将在下面的示例中展示我在Tatsu 5.10.1、Python3.11.6、Linux 6.5.7中试验的例子,如果它们有任何关联的话.

我的目标是呈现Markdown的一个子集,但我将从一个简化的语法开始讨论这个问题.

(我使用单元分隔符作为少见的字符,因为禁用空格处理的其他方法更令人困惑.如果有一种更直接、更可靠的方法来告诉Tatsu将空格识别为它应该作为文本的一部分处理的字符,那么知道这一点也会很有用.)

@@grammar::Markdown

@@whitespace :: /[␟]/

start = pieces $ ;

text = text:/[a-z]+/ ;

pieces = {text}*
    ;

此测试代码导致TatSu忽略[]并且不会因错误而失败. 如果我将markdown_str设置为其他值,如()或{},TatSu将失败. 单独的方括号[或]不会导致异常.

import tatsu

with open("./grammar.txt", "r") as grammar_file:
    grammar = grammar_file.read()

class MarkdownSemantics:

    def pieces(self, ast):
        return ''.join(ast)

parser = tatsu.compile(grammar)

markdown_str = "[]"
ast = parser.parse(markdown_str, semantics=MarkdownSemantics())
print(ast)

我认为这是一个错误,因为我看不出方括号字符有什么特别之处.它们没有被定义为要忽略的空格的一部分,与它们相似的其他字符也被定义为不可忽略的一部分.

与此同时,我被告知这是关于学习解析原则的.我上面的EBNF允许[]通过吗?

推荐答案

您的示例代码不起作用,语义类定义希望pieces()的参数是一个字符串列表,但事实并非如此.

无论如何,问题出在你对whitespace的定义上.与文档所述相反,语法定义中的@@whitespace指令被解释为在标记之间跳过的字符列表(至少我是这样阅读TATSU源代码的).因此,您的语法定义跳过了[].

要禁用空格处理,可以将NoneFalse赋给@@whitespace指令:

@@whitespace :: None

Python相关问答推荐

Python中的锁定类和线程以实现dict移动

Django文件上传不起作用:文件未出现在媒体目录或数据库中

如何匹配3D圆柱体的轴和半径?

Python panda拆分列保持连续多行

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

Python会扔掉未使用的表情吗?

如何检测背景有噪的图像中的正方形

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

numba jitClass,记录类型为字符串

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

try 将一行连接到Tensorflow中的矩阵

将tdqm与cx.Oracle查询集成

如何在FastAPI中为我上传的json文件提供索引ID?

在嵌套span下的span中擦除信息

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

启动带有参数的Python NTFS会导致文件路径混乱

在Admin中显示从ManyToMany通过模型的筛选结果

具有相同图例 colored颜色 和标签的堆叠子图

通过追加列表以极向聚合

使用嵌套对象字段的Qdrant过滤