Python 新线处的grako ebnf标签;流入空间

Python 新线处的grako ebnf标签;流入空间,python,regex,whitespace,ebnf,grako,Python,Regex,Whitespace,Ebnf,Grako,试图用grako生成一个解析器来解析 差不多 tag1: line1 line 2 ... tag2: line1 line2 ... 这样,tag1之前的空白应该被忽略;但是标签应该从新行开始 小ebnf x.ebnf 输入测试: 开始: 错误: 问题: 为什么? 我放了^\s*x,为什么它不匹配 谢谢你的提示 我想我也尝试过使用大写的Xtag和Ytag,但是x:is not x被解析为x表达式,但不是另一行userinputOk,似乎为了或多或少地得到我想要的,我只需要使用它:Xta

试图用grako生成一个解析器来解析 差不多

tag1: line1
line 2 ... 
tag2: line1 
line2
... 
这样,tag1之前的空白应该被忽略;但是标签应该从新行开始

小ebnf x.ebnf

输入测试:

开始:

错误:

问题: 为什么? 我放了^\s*x,为什么它不匹配


谢谢你的提示

我想我也尝试过使用大写的Xtag和Ytag,但是x:is not x被解析为x表达式,但不是另一行userinputOk,似乎为了或多或少地得到我想要的,我只需要使用它:Xtag=/x[^::]*/sep;ytag=/y[^::]*/sep;不过,我还是不明白资本化和非资本化的区别。同样在该解决方案中,关于行中行首空格的信息丢失了……您是如何编译语法的?您需要指定\t作为空白字符,并使用eol=/\r?\n | \r/;在你的语法中,如line=!件/*/eol。另外,使用/*以非结构化方式使用输入是不好的,因为它的第一次出现将匹配输入序列的所有其余部分。我通过在其上运行grako来编译语法:grako x.ebnf>xparser.py&&python3 xparser.py-t test start您可以使用-w选项设置空白字符。例如,grako-w\t xparser.py。然后,您可以在语法中使用“\n”作为标记,例如:line=!件/*$/;。总之,我认为只使用正则表达式可以更好地处理您的简单语言。
START = DATA $;

DATA = piece:{PIECE}+ ;

PIECE = x | y;

sep = ":";

xtag = /^\s*x[^:]*/ sep;
ytag = /^\s*y[^:]*/ sep;

x = xtag val:userinput ;
y = ytag val:userinput ;

userfirstinput = /.*/;
userinput = firstline+:userfirstinput lines:{line}*;
line  = !PIECE /.*/;
  x: First
y: liney
liney2 x: is not x
python3 xparser.py -t test START
grako.exceptions.FailedParse: test.event(1:1) no available options :
  x: First

^
PIECE
DATA
START