gpt4 book ai didi

python - pyparsing lineno 问题(bug?)

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:48 24 4
gpt4 key购买 nike

我正在使用 pyparsing 来解析一种名为 Pig 的语言。当输入文本中有一些“\t”时,使用函数“lineno”时,我发现了一些意想不到的结果。

为了方便提问,我简化了代码来解决问题:

#/usr/bin/env python
from pyparsing import *

ident = Word(alphas)
statement1 = ident + Literal('=')+ Keyword('GENERATE', caseless = True) + SkipTo(Literal(';'),ignore = nestedExpr())+ Literal(';').suppress()
statement2 = Keyword('STORE',caseless = True) + ident + Literal(';').suppress()
statement = statement1|statement2

text = """
fact = GENERATE
('Exp' :(a
)
) ;

STORE fact ;


"""

all_statements = statement.scanString(text)
for tokens,startloc,endloc in all_statements:
print 'startloc:' + str(startloc) , 'lineno:' + str(lineno(startloc,text))
print 'endloc:' + str(endloc), 'lineno:' + str(lineno(endloc,text))
print tokens

请注意,在输入文本中,第三行开头有超过 3 个 '\t'当我运行这个时,输出是:

startloc:1 lineno:2
endloc:66 lineno:10
['fact', '=', 'GENERATE', "('Exp' :(a\n )\n) "]
startloc:68 lineno:10
endloc:80 lineno:10
['STORE', 'fact']

这应该是错误的,因为总共有9行,它说第一个语句是从第2行到第10行。我碰巧发现当我删除那些'\t'时,输入的文本是:

text = """
fact = GENERATE
('Exp' :(a
)
) ;

STORE fact ;


"""

我再次运行,结果是:

startloc:1 lineno:2
endloc:34 lineno:5
['fact', '=', 'GENERATE', "('Exp' :(a\n)\n) "]
startloc:36 lineno:7
endloc:48 lineno:7
['STORE', 'fact']

这个结果看起来是正确的,第一个语句是从第 2 行到第 5 行,第二个语句是从第 7 行到第 7 行。这是我所期望的。

所以我认为 lineno() 函数或 scanString 可能有问题。或者我的代码可能有问题?

最佳答案

使用parseWithTabs在调用 scanString 之前。

关于python - pyparsing lineno 问题(bug?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17097423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com