* 개요 ANTLR 사용하는 프로그램을 WAR 배포하자파싱 결과물이 물음표 ???나 깨진 문자로 바뀌어 있는 상황. * 원인 Lexer 에 집어넣을때 InputStream 을 써서 사용 InputStream is = new ByteArrayInputStream(atds.scr.getBytes())lex = new AtDefine2Lexer(CharStreams.fromStream(is, StandardCharsets.UTF_8) 이때 들어간 InputStream 이 잘못된 것 . * 해결 getBytes() 대신getBytes("UTF-8") 로 변경 * 참고이 상황은 개발 모드에서는 정상적으로 동작했으나WAR 로 export 하여 톰캣에 올렸을때만 나타난 증상 WAR 로 묶는 과정에서 사용하는 클래스의..
* 개요 java.lang.NoClassDefFoundError: org/antlr/v4/runtime/TokenSource ... 또는java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream * 참고버전 3.2 에서 비슷한 현상https://bugzilla.redhat.com/show_bug.cgi?id=1286387 딱히 관련은 없었음 * 환경eclipsemavenhibernate 3.6.4Spring MVC * 원인- hibernate 3.6.4 에서 antlr 2.7.1 을 쓰고 있었음.(pom.xml => dependency hiearachy 에서 확인 ) - 위 antlr 과 별도로 antlr 4.7.1 jar 파일 직접 build pa..
* 개요원 프로젝트를 A라고 가정.A 에 Antlr 이용한 기능 넣고 싶은데, 새로운 언어 개발 테스트를 프로젝트A에서 진행하기 싫다.프로젝트 B를 생성하여 ANTLR 이용한 언어 개발하고완성된 완성된 파일만 A에서 가져다 쓰고 싶다. 1. 프로젝트 B 생성기본적인 ANTLR 생성 방법과 동일함. - ANTLR 시작하기http://dogcowking.tistory.com/64 2. B에서 새 언어 개발g4 파일 생성 후 문법 개발.g4 파일은 지정 없으면 (default package) 에 자바파일을 생성하게 된다.따라서 차후 반영될 패키지를 미리 지정하는 것이 좋다. - 패키지 지정http://dogcowking.tistory.com/65 3. B에서 A의 클래스의 사용이 필요한 경우(기본 개체 같은 ..
계속 작성중인 글임. * 개요 - 리스너, 비지터 동일하게 파싱 트리 노드 순회 위한 메서드는 라는 클래스를 파라메터로 받는다. - 이 클래스들은문법 이름이 Hello 라고 가정할때HelloParser 클래스 아래 static class 로 정의된다. - 이 클래스들은 ParserRuleContext 클래스를 상속받는다. * 예제 문법 Hello grammar Hello;r : 'hello' myId ;myId : ID; ID : [a-z]+ ; WS : [ \t\r\n]+ -> skip ; 기본 문법에서 myId 룰 추가함.. (child 테스트 하려고..) * parserRuleContext.getChild() 하위 노드의 룰 컨텍스트를 가져온다하위 노드가 렉싱룰 또는 텍스트 직접 입력한 경우 Ter..
* Visitor 와 동일한 예제 사용 (Hello) http://dogcowking.tistory.com/186 * 리스너 정의 - VIsitor 와 마찬가지로 인터페이스 HelloListener 와 이를 구현한 HelloBaseListener 가 자동 생성됨. 이를 활용하기 위한 HelloMyListener 를 다음과 같이 정의해보면... public class HelloMyListener extends HelloBaseListener {@Override public void enterR(@NotNull HelloParser.RContext ctx) { }@Override public void exitR(@NotNull HelloParser.RContext ctx) { } // ... 다른 룰 생략}..
비지터 리스너 메서드 반환값 O (비지터 선언시 제너릭으로 해줘야 함) X child 호출 별도로 해줘야 하나? O (visitChildren() 호출해야...) X 룰 시작/끝 메서드 별도로 있나? X (룰마다 1개 메서드) O (enterXXX, exitXXX 로 따로 있음) alternative 선언시 룰 대신 얼터너티브로 받음 동일 노드 순회시 다른 클래스 불필요.. 비지터.visit() 로 독립적 사용 ParseTreeWalker 이용해야.. 기타 메서드 - visitErrorNode()visitTerminal()
InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));lexer.setInputStream(CharStreams.fromStream(stream, StandardCharsets.UTF_8));parser.setInputStream(new CommonTokenStream(lexer)); https://stackoverflow.com/questions/18110180/processing-a-string-with-antlr4 참고 : 스트림 그대로 다시 사용할땐lexer.reset()
* 이클립스에서 비지터 사용하기 - 기본적으로 비지터 생성되지 않음 (no-visitor 옵션) - 프로젝트->우클릭>Properties > ANTLR > Enable project specific setting (프로젝트에 ANTLR 설정 적용 안 된 경우) - 비지터 켜기 위해선 > tool Generate parse tree visitors 체크하면 ANTLR 실행시 -visitor 옵션 주는것과 같음 - 참고: External... 로 실행할 때 -no-visitor 만 빼면 되는게 아니라, -visitor 를 꼭 넣어줘야 함 * 컴파일 하면 (문법 이름이 Abc 라면) AbcBaseVisitor AbcVisitor 가 생김 * 사용 방법 AbcVisitor 를 상속한 후 visit얼터너티브이름(..
* 개요- ANTLR 기본 프로젝트 실행 하는 방법- NEW -> Antlr Project 하면 생성되는 Hello.g4 를 JUnit 이용해서 실행하는 과정 자동생성 되는 Hello.g4 내용/** * Define a grammar called Hello */grammar Hello;r : 'hello' ID ; // match keyword hello followed by an identifier ID : [a-z]+ ; // match lower-case identifiers WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines * 환경Eclipse OxygenAntlr IDE 4JUnit 5 1. JUnit 이 빌드패스 추가되어있어야 함. 2. He..
ANTLR IDE 설치 및 예제 실행 * 환경Ubuntu 14.04Eclipse Oxygen * 참고 https://stackoverflow.com/questions/30128961/trouble-setting-up-antlr-4-ide-on-eclipse-luna-4-4 * 설치 방법Help >> Eclipse Market Place 에서 Find : ANTLR 4 IDE 검색, 설치(ANTLR 4 IDE 아닌 ANTLR IDE 도 있는데 이건 다른거..) - 참고 링크에 표시된 XText Complete SDK, Eclipse Faceted Project Framework 함께 설치 해야 하는지는 의문... * ANTLR 4 Project 시작 방법 1. File >> News Project >> P..
;; 1. antlr 실행으로 파서 등 생성 ;; 오류 : 파일 명과 grammar 선언 명이 틀린 경우- 파일명 hello.g4- 선언시 Hello ;; 2. 생성된 결과를 TestRig으로 테스트- 이때 먼저 javac *.java 실행해줘야 함 javac *.java grun Hello r -tokens ;; 오류 : TestRig 실행시Can't load Hello as lexer or parserhttps://stackoverflow.com/questions/23315302/antlr4-cant-load-hello-as-lexer-or-parser- TestRig은 java 파일이 아니라, class 파일을 찾으므로 먼저 javac *.java 를 실행해주지 않으면 문제가 발생- ClassPat..
;; 환경Windows 7Java 1.8.0_131 ;; 개요- 책 '오픈소스 ANTLR4 입문'(한티미디어) 에서는 jar를 콘솔명령에서 직접 실행- 해당 jar 를 다운받으려면 뒤에 -complete 가 붙은것을 받아야 함.- 책 내용은 4.0 기준이지만, 현시점 최신버전인 4.7 받음. ;; 1. jar 다운로드http://www.antlr.org/download.html 표시된 곳의 antlr-4.7-complete.jar 로 다운 받는다 ;; 2. 실행java -jar antlr-4.7-complete.jar ;; 3. 편하게 사용하기 위한 배치파일 작성 (antlr4.bat)java -cp antlr-4.7-complete.jar;%CLASSPATH% org.antlr.v4.Tool %* ;;..