Pyparsing从解析操作解析子语法

2024-06-10 18:39:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由“语句”列表组成的文件,每个语句都包含一个长度可变的逗号分隔的“列”列表,其中语句的结尾用分号表示:

head(
    col1,
    col2
);
head2(
    col1,
    col2,
    col3
);

我有一个完整文件的工作语法,但是如果其中一列中有语法错误,那么错误消息的信息量就不是很大了,它基本上是说整个语句在开头的paren中很糟糕。在

所以我想单独分析每一列,这样就可以更详细地报告该列中的错误。下面将解析整个文件(两个语句),并从parse actions打印每个语句和列列表:

^{pr2}$

导致:

abc(d 45, e, f g h); s2("much" "stuff", 34 48); 
++ ['abc'] ++ 0 ++
== ['d 45, e, f g h'] === 4 ==
++ ['s2'] ++ 21 ++
== ['"much" "stuff", 34 48'] === 24 ==
[['abc', 'd 45, e, f g h'], ['s2', '"much" "stuff", 34 48']]

但当我试图通过取消注释cols = commaSeparatedList(toks)来解析列列表时,一切都会爆炸:

abc(d 45, e, f g h); s2("much" "stuff", 34 48); 
++ ['abc'] ++ 0 ++
Traceback (most recent call last):
  File "pt.py", line 27, in <module>
    print(script.parseString(ss))
  File "pyparsing.py", line 1115, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "pyparsing.py", line 2732, in parseImpl
    loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "pyparsing.py", line 2624, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "pyparsing.py", line 989, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "pyparsing.py", line 2378, in parseImpl
    loc, exprtokens = e._parse( instring, loc, doActions )
  File "pyparsing.py", line 1015, in _parseNoCache
    tokens = fn( instring, tokensStart, retTokens )
  File "pyparsing.py", line 779, in wrapper
    ret = func(*args[limit[0]:])
TypeError: parse_col() missing 3 required positional arguments: 'strng', 'loc', and 'toks'

我的问题不涉及多线程或递归,但它似乎确实表明pyparsing的可重入调用有问题,可能与context in pyparsing parse actions besides globals有关。在

有没有一种简单的方法可以从一个动作调用pyparsing例程,一个比这个问题的答案更简单的方法?在


Tags: inpyself列表parseline语句pyparsing
1条回答
网友
1楼 · 发布于 2024-06-10 18:39:34

改变

cols = commaSeparatedList(toks)

^{pr2}$

几乎可以修复它,至少在您给出的数据示例中是这样。然而,“much”“stuff”似乎破坏了csl解析器,可能是因为它希望在“much”的结尾后面有一个逗号。在

相关问题 更多 >