<
과 <<
이 모두 포함 된 언어를 구문 분석하고 있습니다. 내 알렉스 정의에서 나는에의보다 적게보다는으로해피 및 알렉 스의 토큰을 뒤로 밀기
tokens :-
"<" { token Lt }
"<<" { token (BinOp Shl) }
내가
<<
가 발생할 때마다 그래서, 왼쪽 교대로 토큰 화됩니다
및 하지 같은 것을 포함 무언가를 가지고있다. 이것은 토큰 화 후에 공백을 버리고 결국 1 < < 2
과 1 << 2
을 구별하기 때문에 일반적으로 좋은 일입니다. 그러나, <<
이 두 <
으로 읽혀 지길 바란 다른 시간이 있습니다. 예를 들어, 내가 분명히
< <A> :: B >
내가 여분의 경우에 수용하기 위해 내 해피 파서 규칙을 조정하기 위해 시도 할 수처럼 읽을 원하는
<<A>::B>
같은 것들을 가지고 있지만, 그것은 심하게 확장 할 수 있습니다. 다른 명령형 파서 생성기에서는 토큰의 "부분"을 밀어 넣는 것과 같은 작업을 시도 할 수도 있습니다 (push_back("<")
과 만났을 때 <<
을 만났을 때만 <
만 필요했습니다).
다른 누구도 그런 문제가 있었습니까? 그렇다면 어떻게 처리 했습니까? 해피에 토큰을 "밀어 넣는"방법이 있습니까? 대신 공백 토큰을 유지하려고해야합니까? (실제로 저는 마지막 대안으로 기울여야합니다. 두통이 심하지 만 <<
을 처리 할 수는 있지만 두 개의 공백 사이에 아무런 공백이 없어야합니다.) <
.
똑똑한 아이디어! Alex가 두 개의 토큰을 얻는 방법을 아직 찾지 못했지만 이것이 어떻게 작동하는지 볼 수 있습니다. 감사! – Alec
@Alec : 그래, 필자는 Parsec에서이 기술을 사용해 본 적이있다. 예를 들어 try (오퍼레이터 <$> char '<' '* notFollowedBy 심볼) <|> LeftAngle <$> char'< '') Alex에서 직접 표현하는 것이 가능합니다. 어떻게 든 미리보기없이 인코딩 할 수 있습니다. –