2016-10-04 3 views
0

중첩 가능한 조건을 설명하고 싶습니다. 여기에 내가 함께 일하고 있어요 무엇 : 여기재귀 규칙에서 {}으로 일치하는 빈 요소를 무시합니다.

foo AND bar 

대서양 표준시 : 나는 라인과 AST를 생성 할 수

expr = (/[_a-zA-Z][a-zA-Z0-9_-]*/) ; 

condop = ("AND" | "OR") ; 
condition = expr { condop condition } ; 

start = condition ; 

좋아

[ 
    "foo", 
    [ 
    [ 
     "AND", 
     [ 
     "bar", 
     [] 
     ] 
    ] 
    ] 
] 

그러나 빈리스트 후이있다 "bar", 조건 규칙이 일치하는 마지막 시간을 추측하기 때문에 "condop condition"은 빈 문자열에 해당합니다. 문서 https://pypi.python.org/pypi/grako/3.16.0에 따르면 {}은 빈 목록을 생성합니다.

이런 일이 발생하지 않도록하는 방법이 있습니까?

답변

1

보고있는 내용은 Grako와 관련이 없습니다. 같은 규칙에서 재귀와 클로저를 모두 사용하고 있습니다.

condition = expr { condop expr } ; 

또는

condition = expr [ condop condition ] ; 

또는 이전에 동일한
condition = expr condop condition | expr; 

:

는 (보다 더) 그 표현을 설명하는 방법은 두 가지가 있습니다.

그라코에서는 모든 경우에 왼쪽 순환이 작동하지 않으므로 사용에 따른 위험은 사용자 자신이 감수해야합니다. 동일한 내용은 다음과 같습니다.

condition = condition condop condition | expr;