2012-02-08 6 views
1

문이 EOL로 구분되는 언어를 구문 분석하려고합니다. 파서는 하나에 의해 분리 문과 코드를 거부여러 EOL을 하나로 처리하는 ANTLR?

stmt_sequence : (stmt EOL)* ; 

: 파서 ​​문법이 사용 후

EOL : ('\r'? '\n')+ ; // any number of consecutive linefeeds counts as a single EOL 

하고 : I는 (워드 프로세서의 예에서 복사) 렉서 문법이 시도 더 많은 빈 줄.

그러나,이 성공 : 내가 ANTLR의 안돼서

EOL : '\r'? '\n' ; 

stmt_sequence : (stmt EOL+)* ; 

. 둘 다 작동해야하는 것 같습니다. 욕심 스럽거나 비합법적 인 렉서 스캔에 대해 이해할 수없는 부분이 있습니까?

나는 이것을 3.2와 3.4 모두 시도했다. Eclipse에서 ANTLR IDE를 실행 중입니다. 인디고 OS X 10.6.

감사합니다.

답변

0

원본 문법에 오류가 없습니다. 그러나 입력 데이터에서. EOL 후에 탭을 자동으로 삽입하는 편집기 (이클립스 사용)를 사용하여 "빈 줄"이 실제로 비어 있지 않았습니다. 예상대로

fragment SPACE: ' ' | '\t'; 

EOL : ('\r'? '\n' SPACE*)+; 

이 문법 작동 다음과 같이

나는 문법을 수정했습니다.

여기서 공백은 공백을주의해야한다는 것입니다. 렉서는 파서가 볼 수없는 입력에서 공백을 볼 수 있습니다 (이미 숨겨진 채널로 전송 되었기 때문에).

관련 문제