2014-09-13 2 views
3

파스칼 문법에 따르면 프로그램은 점으로 끝납니다. 그리고 Free Pascal (FPC/Lazarus)은 나머지 문자를 생략합니다.해피 (Haskell의 파서 생성기)의 나머지 입력 생략

비슷한 동작이 필요합니다. 커스텀 모나드 토크 나이 저는 하나의 게으 르기 때문에, 기본 규칙이 성공했을 때 계속해서 행복을하지 않기를 바랄뿐입니다.

기본적으로 나는이 같은 somithng 싶습니다 :이 마지막 점을 분석 한 후이 오류가 발생할 수 있기 때문에 더 토큰이 전혀 발생하지해야하는 것이 중요하다

Program : Header Decls Body '.' SKIP_THE_REMAINING_INPUT { ... } 

.

답변

1

그래서 해결책을 찾았습니다. 나는 그것이 소스 저장소의 git log 읽기 발견하지만

documentation에 설명 해피부분 구문 분석이라는 기능이있다. 파서는 나머지 입력을 버릴 수 있습니다.

%name parser {- normal parser -} 
%partial parser {- partial parser -} 

하지만 내 두 번째 요구 사항에 맞지 않는 작동하는 방식 : %name는 다른 지시어를 사용하여 선언이 더 입력을 소비하는 게으른 토크 나이를 강제해서는 안된다. 대신 구문 분석 할 내용이 더 있는지 확인하기 위해 정확히 하나 이상의 토큰이 필요합니다.

!가 유효한 기호 아니라고 가정 및 토크 나이는 다음 입력을 소비하고 고려하는 실패 때문에,

  1. begin end. valid_token!!!
  2. begin end.!

구문 분석 (1) 성공을 해피는 valid_token을 검사하고 거기서 멈추지 만, 하나의 토큰이 더 필요하기 때문에 파싱 (2)이 실패하고 토큰 화기는이를 제공 할 수 없으므로 실패합니다.

분명히이 동작을 변경할 수있는 방법이 없기 때문에 제 해결 방법은 문법에 아무 것도 나타나지 않는 특수 토큰으로 어휘 오류를 나타내는 것입니다. 따라서 tokenizer가 ! (또는 다른 유효하지 않은 문자)을 만날 때 특별한 오류 토큰을 산출합니다. 또한 어휘 오류를 복구하는 데 도움이됩니다.