2008-10-07 10 views
1

나는 간단한 문법을 ​​가지고 있으며 antlr 2.7.7을 사용하여 한 쌍의 C# 클래스를 생성했습니다. 파서가 토큰에 오류를 발견하면 예외를 throw합니다. 토큰이 파스 된 스트림에 얼마나 많은 문자가 있는지 알아야합니다. 어떻게해야합니까?ANTLR 2에서 문자 위치를 찾으려면 어떻게해야합니까?

답변

2

내가 ANTLR로 게임을 한 지 오래되었지만, 내가 잘 기억하면 원하는 것을하기 위해 새로운 토큰이 발견 될 때마다 증가하는 문자 카운터를 유지하도록 파서를 서브 클래스해야만했다. (토큰 길이는 물론).

2

Terrence Parr의 "The Definitive ANTLR Reference"에서 10 장 ("오류보고 및 복구")을 읽어야합니다.

사용중인 대상 언어를 알지 못하면 무엇을 해야할지 정확히 알기가 어렵습니다. 하지만 당신이 Java 타겟을 사용하고 있다고 가정하고, 내가 틀렸다면 나를 바로 잡을 수 있습니다.

ANTLR 인식기가 입력 문자열과 일치하지 않으면 실패 컨텍스트를 기반으로 매우 특정한 예외가 발생합니다. RecognitionException은 루트 유형이며 MismatchedTokenException, MismatchedTreeNodeException, NoViableAltException, EarlyExitException, FailedPredicateException, MismatchedRangeException, MismatchedSetException, MismatchedNotSetException과 같은 8 개의 서브 클래스가 있습니다.

루트 예외 유형 (RecognitionException)에는 ("index", "line"및 "charPositionInLine"과 같은) 몇 가지 편리한 공개 필드가 있습니다. "색인"필드는 오류가 발견 된 정확한 문자 위치를 알려줍니다. "line"및 "charPositionInLine"필드는 매우 자명합니다. 여기의 JavaDoc의 :

http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html

+0

나는 C# .NET을 목표로하고있어 - RecognitionException 클래스는 "라인"과 "열"가 아니라 "인덱스"를 가지고 있으며, 그들 모두는 항상 -1로 설정 될 것으로 보인다. 위의 문서는 ANTLR 3 사이트에 있습니다. ANTLR 2에도 여전히 적용됩니까? – Simon

+0

Hmmmmmmm. 불행히도, 나는 내가 너에게 어떤 도움이 될 수 있다고 생각하지 않는다. 죄송합니다 :( – benjismith