由于某种原因,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允许[
或]
通过吗?