2016-06-05 2 views
0

방금 ​​ANTLR4의 알파 버전을 사용하고있는 빈 프로젝트와 일치하는 프로젝트를 업그레이드했습니다. ANTLR4가 그것이 일치하고 공백으로 설정되었다는 경고를 던지는 것이 모두 일어날 것입니다.Antlr4 - lexer에서 빈 집합 매치

이제 ANTLR 언어 지원 1.2.1을 사용하고 파서 생성기는 지금 오류가 발생 4.3.0 : - 두 곳에서 "오류 1 '>'는 렉서 규칙을 맞추어 나에게 완전한 놀라움으로 온을" 빈 세트와 일치해야합니다.

가에 고장 코드의 일부 :

mode FILE_MODE; 
    ASCII: FASCII   -> mode(PATH_MODE); 
    UTF8: FUTF8    -> mode(PATH_MODE); 
    UTF16: FUTF16   -> mode(PATH_MODE); 
    EMPTY_FILE_TYPE:  -> skip, mode(PATH_MODE); // Throws the error on this line 

이 어떻게 지금 빈 규칙과 일치 하는가?

테리

답변

0

하나는 그렇지 않습니다.

이전 경고는 Antlr이 해당 줄의 기능 코드를 생성하지 않았을 가능성이 있음을 나타냅니다. 문법이 이전에 작동했다면, 그 Antlr 버전에서 정의되지 않은 행동 때문일 가능성이 큽니다.

이제 선을 제거하십시오. 일치하는 파일 모드 콘텐츠가있는 경우에만 모드 스위치를 FILE_MODE으로 전환해야하는지 여부를 확인해야합니다. 그렇지 않은 경우 경로 모드 콘텐츠가 있는지 고려하십시오.

최상의 모드 계획/보호 상태를 결정하는 것은 까다 롭습니다. 때때로 유일한 해결책은 미리보기를 사용하는 술어입니다. 더 나아가, 모범 사례 소스 및 완전한 관련 규칙 세트가 필요합니다.

+0

예제에 표시된 빈 세트를 해결했다고 생각하지만 현재 해결해야 할 빈 세트가 필요한 또 다른 훨씬 복잡한 모드로 인해 컴파일 할 수 없습니다. 나는 일련의 조각들로 모드를 깨뜨릴 수 있을지도 모른다. 그런 다음 훨씬 더 큰 조각으로 조각들을 함께 다시 붙인 다음 '?' 운영자. 그러나 이것은 조각이 그것의 타입을 변경할 수있는 능력을 갖도록 요구한다. ** 조각 MODIFIER_ID : FIDENT -> 유형 (IDENT); **. 컴파일러는 구문을 허용하지만 어디에도 문서화 된 것을 본 적이 없습니다. 그래서 구문을 합법적으로 바꾸기 시작하기 전에? – Terry151151

+0

생성 된 코드를 살펴보십시오. 꽤 읽을 수 있습니다. – GRosenberg