2016-10-07 14 views
1
class A(List): 
    grammar = [(Symbol, ':', Symbol), Symbol] 

compose(parse('a', A)) 

구문 분석하는 동안 compose 오류가 발생합니다.pypeg은 목록으로 문법을 작성할 수 없습니까?

난 단지 더미 클래스를 사용하여 우회 할 수 있습니다

class B(List): 
    grammar = Symbol, ':', Symbol 
class A2(List): 
    grammar = [B, Symbol] 

compose(parse('a', A2)) 

는 이제 제대로 구성한다.

무엇이 잘못 되었나요?

답변

1

pyPEG에서 버그를 발견했습니다.

List 개체를 구성 할 때 pyPEG는 스택을 사용하여 다음에 작성할 목록 항목을 추적합니다. 문법의 튜플은 스택에서 항목을 제거하지만 터플이 일치하지 않는 경우에도 항목을 다시 배치하지 않습니다. 코드에서 빈 스택의 요소에 액세스하려고하면 IndexError가 발생합니다.

Stack     Grammar      Action     
----------------------------------------------------------------------- 
[Symbol('a')] [(Symbol, ':', Symbol), Symbol] matched, pop stack 
        ^^^^^^ 

[]    [(Symbol, ':', Symbol), Symbol] str, append to text 
          ^^^ 

[]    [(Symbol, ':', Symbol), Symbol] no match 
           ^^^^^^ 

[]    [(Symbol, ':', Symbol), Symbol] IndexError! 
             ^^^^^^ 

내가 수정으로 pull request 제출 : 귀하의 예를 들어

, 그것은 다음과 같이 보입니다.