2013-01-06 3 views
2

haskell에 js 파서를 구현하려고합니다. 하지만 자동 세미콜론 삽입이 붙어 있습니다. 문제가있는 주위에 놀기 위해서 test project을 만들었지 만 문제를 해결하는 방법을 알 수는 없습니다. 나는이 같은 입력을 구문 분석 할파섹 및 사용자 정의 상태

data Token 
    = SemicolonToken 
    | NumberToken Number 
    | PlusToken 

:

data Program = Program [Expression] 

data Expression 
    = UnaryExpression Number 
    | PlusExpression Number Number 

입력 스트림 토큰의 목록입니다 : 내 테스트 프로젝트 프로그램에서

은 (단항 또는 바이너리) 식의 목록입니다 :
1; - 단항 표현
1 + 2; - 이진 표현
1; 2 + 3; - 두 표현식 (단항 및 이진)
1 2 + 3; - 이전 입력과 동일하지만 첫 번째 세미콜론이 없습니다. 따라서 파서는 토큰 1을 소비하지만 토큰 2는 문법 생성에 의해 허용되지 않습니다 (다음 예상 토큰은 세미콜론 또는 플러스입니다). 자동 세미콜론 삽입 규칙에 따르면이 경우 토큰 2 앞에 세미콜론이 자동으로 삽입됩니다.

이렇게 파서 동작을 구현하는 가장 우아한 방법은 무엇입니까?

답변

1

당신은

expression = try unaryExpression <|> plusExpression 

을 가지고 있지만 UnaryExpressionPlusExpression의 접두사이기 때문에 즉, 작동하지 않습니다. 파서가 행복하게 처음 NumberToken을 구문 분석하고 자동으로 다음 토큰이 PlusToken 아닌 SemicolonToken 때문에, 세미콜론을 추가

input2 = [NumberToken Number1, PlusToken, NumberToken Number1, SemicolonToken] 

에 대한 그래서. 그런 다음 다음 Expression을 구문 분석하려고 시도하지만 그 다음은 PlusToken이며, Expression은 그 것으로 시작할 수 없습니다.

변경 파서 시도되는 순서,

expression = try plusExpression <|> unaryExpression 

과 먼저 PlusExpression을 구문 분석을 시도합니다, 그리고이 UnaryExpression의 짧은 구문 분석에 의존 실패하는 경우에만 사용할 수 있습니다.

관련 문제