infixNotation
(이전 operatorPrecedence
)을 사용하여 문법을 쓰려고하는데 setResultsName
을 사용하는 방법을 알 수 없습니다.요약 : setResultsName과 infixnotation을 결합
내가 이것을하려고하는 이유는 부울 검색 쿼리를위한 문법을 searchparser 상단에 작성했지만 아주 긴 표현식의 경우 RecursionError: maximum recursion depth exceeded in comparison
으로 실행됩니다.
내가 대한 파싱 책에 주어진 예에서 시작했다 :
and_ = CaselessLiteral("and")
or_ = CaselessLiteral("or")
not_ = CaselessLiteral("not")
searchTerm = Word(alphanums) | quotedString.setParseAction(removeQuotes)
searchExpr = infixNotation(searchTerm,
[
(not_, 1, opAssoc.RIGHT),
(and_, 2, opAssoc.LEFT),
(or_, 2, opAssoc.LEFT),
])
그래서, 내가 어떻게 여기 ParseResultName을 설정합니까?
내가 운영자로 설정하려고하면 :
or_ = CaselessLiteral("or").setResultsName("OR")
이 같은 모양이 문자열 ('용어 1이나 용어 2 또는 term3')에 대한 결과 parseResult :
<ITEM>
<word>
<word>
<ITEM>term1</ITEM>
</word>
<OR>or</OR>
<word>
<ITEM>term2</ITEM>
</word>
<OR>or</OR>
<word>
<ITEM>term3</ITEM>
</word>
</word>
</ITEM>
을
: 나는 조건이 연산자의 인수로 배열 같은 것을 원하는 반면 모든 용어와 연산자, 같은 수준에있는 것을 의미한다
<OR>
<OR>
<word>
<ITEM>term1</ITEM>
</word>
<OR>
<word>
<ITEM>term2</ITEM>
</word>
<word>
<ITEM>term3</ITEM>
</word>
</OR>
</OR>
</OR>
나는 내 이전 문법이 같은함으로써이를 달성하는 데 사용 :
operatorOr << (Group(
operatorAnd + Suppress(Keyword("OR", caseless=True)) + operatorOr
).setResultsName("OR") | operatorAnd)
하지만 운영자 만든 그룹에 결과 이름을 설정하는 방법을 파악하고 두 개의 인수 할 수 ?