Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python textx语法,使用空格作为重复修饰符_Python_Python 3.x_Textx - Fatal编程技术网

Python textx语法,使用空格作为重复修饰符

Python textx语法,使用空格作为重复修饰符,python,python-3.x,textx,Python,Python 3.x,Textx,我正在尝试为使用的输入文件编写解析器。在大多数情况下,忽略空白是完美的,因为大多数参数和值都应该用逗号分隔。然而,这是可以接受的,而且看来该计划也将过时 我已经删减了这个问题的语法定义,但是下面的代码显示数据中有两条记录,它们以&开头,以/结尾。每个记录有两个参数。第一条记录有一些字符串值,而第二条记录有一些数值。这段代码运行良好 导入textx def测试解析网格(模型): 预期={ “XB”:[0.0,5.0,0.0,4.0,0.0,3.0], "IJK":[50,40,30],, } 解析

我正在尝试为使用的输入文件编写解析器。在大多数情况下,忽略空白是完美的,因为大多数参数和值都应该用逗号分隔。然而,这是可以接受的,而且看来该计划也将过时

我已经删减了这个问题的语法定义,但是下面的代码显示
数据中有两条记录,它们以
&
开头,以
/
结尾。每个记录有两个参数。第一条记录有一些字符串值,而第二条记录有一些数值。这段代码运行良好

导入textx
def测试解析网格(模型):
预期={
“XB”:[0.0,5.0,0.0,4.0,0.0,3.0],
"IJK":[50,40,30],,
}
解析={
param.name:param.value
用于model.records[1]中的参数
}
预期断言==已解析
语法=”“
型号:记录*=记录;
记录:/^&/namelist=ID parameters*=Parameter[',']'/';
参数:name=ID'='value+=value[','];
值:(数字|字符串);
"""
data=”“”
&HEAD CHID='Some Value',TITLE='另一个字符串'/
&网格IJK=50,40,30,
XB=0.0,5.0,0.0,4.0,0.0,3.0/
"""
mm=textx.metamodel_from_str(语法)
模型=毫米。模型来自(数据)
测试网格(模型)
但是,我希望能够修改
语法
,以便能够解析以下版本的
数据

data=”“”
&HEAD CHID='Some Value',TITLE='另一个字符串'/
&网格IJK=50 40 30
XB=0.05.0.04.0.03.0/
"""
我已经看过了,并且能够让下面的内容起作用,但是无法让它在更大的语法定义中起作用。我还试图改变,但无法让它正常工作

grammar=”“”
记录[noskipws]:参数*=参数[/,|\s+/];
参数[noskipws]:/\s*/name=ID/\s*=\s*/value+=NUMBER[/,|\s+/];
"""
data=”“”
IJK=50 40 30
XB=050403
"""
mm=textx.metamodel_from_str(语法)
模型=毫米。模型来自(数据)
预期={'XB':[0.0,5.0,0.0,4.0,0.0,3.0],'IJK':[50,40,30]}
assert{param.name:model.parameters}中param的param.value==应为

如何修改顶部的语法以正确解析没有逗号的第二个版本的
数据
?我会接受一个能让它正常工作的答案,但理想情况下,在这两种情况下都能处理缺少的逗号。

当我看到你的帖子时,我认为解决方案应该是一个简单的可选分隔符匹配,如:

Model: records*=Record;
Record: /^&/ namelist=ID parameters*=Parameter[/,?/] '/';
Parameter: name=ID '=' value+=Value[/,?/];
Value: NUMBER | STRING;
但是,它不起作用。在一些调试输出调查之后,我注意到可选的分隔符匹配
,?
,尽管在缺少逗号的地方成功将终止重复匹配。这只虫子在琶音中。我只是做了个补救。它在
master
分支上可用,因此现在请从GitHub安装。我很快就会发布新版本的琶音。通过提供的错误修复,上述语法可以正常工作。您甚至可以混合搭配,在某些地方使用分隔符,例如:

&HEAD CHID='Some Value' TITLE='another string'/
&MESH IJK = 50 40, 30,
      XB  = 0.0 5.0, 0.0 4.0 0.0 3.0/


编辑[2021-04-25]:Arpeggio 1.10.2发布时使用了此答案中提到的修复程序。

我喜欢
/,?/
语法!那看起来又漂亮又干净。很高兴知道textx文档中没有遗漏任何内容。感谢您监视textx标记。不客气。仅供参考,
/../
之间的语法是标准的Python正则表达式语法,因此您在
re
模块中使用的所有东西都应该在这里工作。不仅对于分隔符,而且对于任何正则表达式匹配。@Cohan Arpeggio的错误修复版本已经发布,所以您可以像往常一样安装。