pyparsing lineno问题(bug?)

时间:2013-06-13 21:30:29

标签: python pyparsing

我正在使用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可能有问题。 或者我的代码可能有问题?

1 个答案:

答案 0 :(得分:1)

在致电scanString之前使用parseWithTabs