2013-07-06 3 views
2

ANTLR에 의해 생성 된 java 파서가 임의로 큰 파일을 스트리밍 할 수 있습니까?ANTLR4 자바 파서는 매우 큰 파일을 처리 할 수 ​​있습니까? 아니면 파일을 스트리밍 할 수 있습니까?

UnbufferedCharStream을 사용하여 Lexer를 생성하고 파서에 전달했습니다. UnbufferedCharStream에 대한 크기 호출로 인해 UnsupportedOperationException이 발생했으며 UnbufferedCharStream에서 크기를 호출 할 수 없다는 예외가 포함되어 있습니다.

new Lexer(new UnbufferedCharStream(new CharArrayReader("".toCharArray()))); 
    CommonTokenStream stream = new CommonTokenStream(lexer); 
    Parser parser = new Parser(stream); 

기본적으로 돼지를 사용하여 hadoop에서 내 보낸 파일이 있습니다. '\ n'으로 구분 된 행이 많습니다. 각 열은 '\ t'로 나뉩니다. 이것은 버퍼 판독기를 사용하여 각 행을 읽을 때 java에서 구문 분석하기 쉽습니다. 그런 다음 '\ t'로 나누어 각 열을 가져옵니다. 그러나 나는 또한 일종의 스키마 검증을 원합니다. 첫 번째 열은 올바른 형식의 날짜 여야하며 일부 가격 열 뒤에는 일부 16 진수 열이옵니다. 내가 생성 된 파서 코드를 볼 때

나는이 나에게 개념적으로 내가 반복 할 수있는 목록을 줄 것이다 그래서

parser.lines().line() 

과 같이 호출 할 수있다. 그러나 목록을 얻을 때까지 목록 크기가 고정 된 것으로 보입니다. 파서가 이미 전체 파일을 파싱했음을 의미합니다.

정말 큰 파일을 스트리밍 할 수있는 API의 다른 부분이 있습니까? 방문자 또는 수신기를 사용하여 파일을 읽는 동안 호출되는 것과 같은 방법이 있습니까? 그러나 전체 파일을 메모리에 보관할 수는 없습니다. 그것은 적합하지 않습니다.

InputStream is = new FileInputStream(inputFile);//input file is the path to your input file 
ANTLRInputStream input = new ANTLRInputStream(is); 
GeneratedLexer lex = new GeneratedLexer(input); 
lex.setTokenFactory(new CommonTokenFactory(true)); 
TokenStream tokens = new UnbufferedTokenStream<CommonToken>(lex); 
GeneratedParser parser = new GeneratedParser(tokens); 
parser.setBuildParseTree(false);//!! 
parser.top_level_rule(); 

을 그리고 파일이 매우 큰 경우, 수신기 또는 방문자 잊어 - 나는 문법에 직접 객체를 생성 할 것이다 :

답변

1

이 같은 그것을 할 수 있습니다. 그것들을 모든 구조체 (즉, HashMap, Vector ...)에 넣고 필요에 따라 검색하면됩니다. 이 방법은 구문 분석 트리를 만드는 것입니다 (그리고 이것은 실제로 많은 메모리를 필요로합니다).

+0

나는 Parse Tree Listeners로 구현 된 솔루션을 가지고있다. 파스 트리를 생성하지 않는 위의 솔루션이 리스너를 호출하는지는 분명하지 않습니다. 그것은 그럴 것 같지 않습니다. 문법에 개체를 생성하면 문법 정의 파일에 문법이 아닌 내용이 포함됩니다. (. –

+0

@RossYoungblood 맞습니다. 청취자도없고 방문자도 없습니다. 문법적이지 않은 문법입니다 (문법 작업이라고 부름). 완벽합니다. . antlr 책에서 어떻게 계산기를 만들 수 있는지에 대한 예제가있다. – cantSleepNow

+0

문법 작업을 사용하는 방법, 나는 단지 원하지 않는다. 구문 분석 트리 리스너로 큰 파일의 문제를 해결하고 싶다. 내가 지금 조사하고있는 길. –

관련 문제