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();
을 그리고 파일이 매우 큰 경우, 수신기 또는 방문자 잊어 - 나는 문법에 직접 객체를 생성 할 것이다 :
나는 Parse Tree Listeners로 구현 된 솔루션을 가지고있다. 파스 트리를 생성하지 않는 위의 솔루션이 리스너를 호출하는지는 분명하지 않습니다. 그것은 그럴 것 같지 않습니다. 문법에 개체를 생성하면 문법 정의 파일에 문법이 아닌 내용이 포함됩니다. (. –
@RossYoungblood 맞습니다. 청취자도없고 방문자도 없습니다. 문법적이지 않은 문법입니다 (문법 작업이라고 부름). 완벽합니다. . antlr 책에서 어떻게 계산기를 만들 수 있는지에 대한 예제가있다. – cantSleepNow
문법 작업을 사용하는 방법, 나는 단지 원하지 않는다. 구문 분석 트리 리스너로 큰 파일의 문제를 해결하고 싶다. 내가 지금 조사하고있는 길. –