2011-12-23 4 views
3

두 부분으로 이루어진 파일을 구문 분석해야합니다. 첫 번째 줄에서는 새 줄을 건너 뛰어야합니다. 두 번째 항목에서는 중요하며 구분 기호로 사용됩니다.선택적으로 컨텍스트에 따라 줄 바꿈 건너 뛰기

http://www.antlr.org/wiki/pages/viewpage.action?pageId=1734과 같은 솔루션을 피하고 대신 술어를 사용하고 싶습니다. 내가 파일의 두 번째 부분을 "입력"때 true로 설정되어 동적 범위 변수 keepNewline을 추가하려고

WS:  (' ' | '\t' | NEWLINE) {SKIP();}; 
fragment NEWLINE : '\r'|'\n'|'\r\n'; 

: 순간

는, 내가 좋아하는 뭔가가있다.

그러나 올바른 줄 바꿈을 사용하여 줄 바꿈 건너 뛰기를 끌 수 없습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

답변

4

생각보다 쉽습니다. 당신은 술어조차 필요하지 않습니다.

<pre> ... </pre> 태그 내에서만 줄 바꿈을 보존한다고 가정 해 봅시다. 당신이 클래스를 테스트 할 수 있습니다

grammar Pre; 

@lexer::members { 
    private boolean keepNewLine = false; 
} 

parse 
: (t=. 
    { 
    System.out.printf("\%-10s '\%s'\n", tokenNames[$t.type], $t.text.replace("\n", "\\n")); 
    } 
    )* 
    EOF 
; 

Word 
: ('a'..'z' | 'A'..'Z')+ 
; 

OPr 
: '<pre>' {keepNewLine = true;} 
; 

CPr 
: '</pre>' {keepNewLine = false;} 
; 

NewLine 
: ('\r'? '\n' | '\r') {if(!keepNewLine) skip();} 
; 

Space 
: (' ' | '\t') {skip();} 
; 

가 :

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    PreLexer lexer = new PreLexer(new ANTLRFileStream("in.txt")); 
    PreParser parser = new PreParser(new CommonTokenStream(lexer)); 
    parser.parse(); 
    } 
} 

그리고 in.txt 경우가 포함됩니다 :

foo bar 
<pre> 
a 

b 
</pre> 


baz 

Main 클래스를 실행의 출력을 다음 더미 문법은 그 수행

Word  'foo' 
Word  'bar' 
OPr  '<pre>' 
NewLine '\n' 
Word  'a' 
NewLine '\n' 
NewLine '\n' 
Word  'b' 
NewLine '\n' 
CPr  '</pre>' 
Word  'baz' 
+0

고마워요! 그것은 정말로 내가하려고했던 것보다 훨씬 쉽습니다 ... ^^ – Korchkidu