2013-06-25 1 views
4

나는 파섹에 파서를 쓰고있다. E -> E + E와 같은 왼쪽 반복 생성은 LL 파서에서 쉽게 작성할 수 없으므로 Parsec은 중위어, 접미사 및 접두어 연산자를 지원하는 buildExpressionParser을 제공합니다. 하지만 아래 첨자 연산자는 어떻습니까?Parsec에서 첨자 연산자를 구현하는 방법은 무엇입니까?

E -> E [E]는 어떻게 구현됩니까? 두 번째 표현식을 사용하지 않고 닫는 괄호를 사용할 수 있다면 buildExpressionParser에 대한 중위 테이블 항목을 사용하여 에뮬레이션 할 수 있습니다. 생각?

편집 : 내 문법에 가장 적합한 왼쪽 재귀 제거 알고리즘이 있다는 것을 알고 있습니다. 나는 쉽거나, 추상적 인 것을 찾고있다 (예 : buildExpressionParser). 그렇지 않으면 나는 단지 행복을 사용할 것이다.

+1

:

term :: MParser (Expr LocInfo) term = do indBase <- termNoArray indexes <- many $ (brackets expression >>= return) return -- semantics <?> "term" termNoArray :: MParser (Expr LocInfo) termNoArray = -- normal terms 

마지막으로, 우리는 표현의 최상위 파서를 가지고있다. 해피는 추상의 하스켈의 힘을 회피합니다. – luqui

+0

그냥'buildExpressionParser'를 가진'Postfix'로하십시오. – luqui

+0

postfix는 어떻게 도움이됩니까? 그것과 함께 닫는 브래킷을 일치시킬 수는 있지만, 하나의 일치하는 방법은 없습니다. – BruceBerry

답변

1

우리 프로젝트에서 수동으로 표현식에서 왼쪽 재귀를 제거했습니다. 이것은 다음과 같은 방식으로 작동합니다 :

우리는 표현의 일반적인 양식을 작성하는이 용어 파서에 의해 파라미터된다
expressionGen :: MParser (Expr LocInfo) -> MParser (Expr LocInfo) 
expressionGen term = buildExpressionParser precedenceTable term <?> "expression" 
    where precedenceTable = -- unary, binary expressions 

우리는 일반적인 용어 파서, 재귀 규칙의 무료 기간 파서 있습니다. 즉, 우리는 (여러) 첨자 연산자를 구문 분석 할 수 있습니다 :이 또는 기본적으로 어떤 이유로 행복 사용에 대해 추천 할 것입니다 expression = expressionGen term

관련 문제