2016-12-04 2 views
0

필자 자신의 렉서 작성을 시작했으며 토큰 화 문자열에 시작 문자 (")와 끝 문자 (")가 있으므로 문제가 발생했습니다.Lexer : 토큰 화 중에 종결되지 않은 문자열 처리

누구든지 렉서 (lexer)가 종결되지 않은 문자열을 가지고 있어도 계속 렉싱 할 수있는 일반적인 기술을 알고 있습니까? ANTLR에서 ATN이 처리하는지 ANTLR이이를 수행 할 수 있다고 생각하십니까?

내가 거기 문자열이 한 줄에 종료해야한다는 것을 가정하고 여기에 두 가지 문제가되는 볼 수 있습니다

  1. 문자열 종료는 별도의 줄에 발생 - 따라서 문자열은 단일에 넣어 수 있습니다 사용자에게 경고 선.
  2. 문자열 종료가 발생하지 않으면 계속할 유효 시점은 언제입니까? 새 행 다음에 유효한 다음 토큰의 추론을 사용하십시오.

char *mystring = "my string which is unterminated.... 
int id = 20; 

답변

1

언어가 그럼 그냥 허용 될 가능성이 줄 끝에 문자열을 종료, 문자열 리터럴에 줄 바꿈을 금지합니다. 문자열 리터럴과 같은 줄에 선언문이나 키워드 문이있을 가능성은 희박합니다 (보상을 시도하여 잘못된 스타일을 장려 할 이유가 없습니다).

유용한 닫기 괄호는 건너 뛸 수 있습니다 :

printf("%s\n, line); 

하지만 대처할 수있는 복구 규칙이있을 수 있습니다.

문자열 리터럴에 개행 문자가 포함될 수 있으며이 기능이 자주 필요하다는 충분한 증거가있는 경우 복구가 다소 어려워서 가장 단순한 해결책은 구문 오류를 던지는 것입니다. 문제가되는 문자열이 어디에 시작되었는지 명확하게 설명합니다.

+0

어딘가에 오류 처리가 렉서가 아닌 파서에 던져진 것이 훨씬 더 나은 해결책을 읽었습니다. 여기에 토큰이 없기 때문에이 점에 대한 귀하의 의견은 무엇입니까? 여기에 토큰이 없으므로 어떻게 전달합니까? – Har

+1

@har : 오류 처리를 중앙 집중화하기위한 인수가 있지만 스캐너에서 어휘 오류가 항상 감지 될 것입니다. 나는 보통 yyerror를 호출하여 오류를보고한다. 나쁜 토큰 (똑같이 나쁜 번호에 적용됨)의 경우 일반적으로 수행해야 할 것이 없습니다. 물론 "나쁜 리터럴 (bad literal)"토큰을 반환 할 수 있고, BAD_LITERAL을'value' (또는 당신의 기본 비 - 터미널이 무엇이든)로 변환시키는 단위 프로덕션으로 파서에서 에러 메시지를 생성 할 수 있습니다. 오류. – rici