2013-06-13 3 views
1

나는 pyparsing을 사용하여 pig이라는 언어를 구문 분석합니다. 입력 텍스트에 '\ t'가있을 때 'lineno'함수를 사용하면 예기치 않은 결과가 나타납니다. 입력 텍스트에서, 3 개 이상 '의 \ (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 

주의 사항 :

에게 쉽게 들어

, 내가 문제를 해결하기 위해 코드를 단순화 나는 이것을 실행, 출력은 다음과 같습니다 총이있는 한

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 호선이며, 두 번째 statemenet 라인 7 라인이다 7. 이것이 내가 기대했던 것입니다.

lineno() 함수 또는 scanString에 문제가있을 수 있습니다. 아니면 내 코드에 문제가 있습니까?

답변