티스토리 뷰
목차
[JavaCC 강좌] 자바CC 설치, 사용법, 문법, API, 계산기 예제
JavaCC 설치
1. https://javacc.dev.java.net/[클릭]에 접속한다.
[자바 계산기] javacc 프로젝트 홈페이지
2. javacc-5.0.zip을 다운받는다.
[자바 설치 문법] javacc 5.0 다운
3. C 디렉터리 아래에 압축을 푼다.
[자바 사칙연산 API] JavaCC 압축 해제 후
4. path에 C:\JavaCC\bin을 추가한다.
[자바 계산기] 환경 변수에 사용자 변수 편집
JavaCC 문법, API 다루기
5. 간단한 덧셈에 대한 문법을 체크한다. Adder.jj라는 이름으로 다음 문서를 저장한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | options { LOOKAHEAD=2; } PARSER_BEGIN(Adder) public class Adder { public static void main(String args[]) throws ParseException { Adder parser = new Adder(System.in); while(true) { parser.parseOneLine(); } } } PARSER_END(Adder) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER: (<DIGIT>)+> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { } { expr() { System.out.println("well-defined"); } <EOL> | <EOL> | <EOF> { System.out.println("well-defined");System.exit(-1); } } void expr(): { } { <NUMBER> "+" <NUMBER> } | cs |
6. javacc Adder.jj를 수행한다.
7. javac Adder.java를 수행한다.
8. java Adder를 수행하여 1+2, 3+4, 3-4를 수행하여 결과를 확인한다.
9. 간단한 덧셈을 수행하도록 Adder.jj에 코드를 다음과 같이 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | options { LOOKAHEAD=2; } PARSER_BEGIN(Adder) public class Adder { public static void main(String args[]) throws ParseException{ Adder parser = new Adder(System.in); while(true){ parser.parseOneLine(); } } } PARSER_END(Adder) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER: (<DIGIT>)+> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { double a; } { a = expr() { System.out.println("well-defined"); System.out.println(a); } <EOL> | <EOL> | <EOF> { System.out.println("well-defined"); System.exit(-1); } } double expr(): { Token t; Token t1; } { t = <NUMBER> "+" t1 = <NUMBER> { return Double.parseDouble(t.toString()) + Double.parseDouble(t1.toString()); } } | cs |
10. javacc Adder.jj를 수행하고 javac Adder.java를 수행한 후 java Adder를 수행하여 숫자 덧셈이 잘 처리되는지 확인한다.
JavaCC 계산기 기능 추가하기
11. 뺄셈을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | options { LOOKAHEAD=2; } PARSER_BEGIN(Adder) public class Adder { public static void main(String args[]) throws ParseException{ Adder parser = new Adder(System.in); while(true){ parser.parseOneLine(); } } } PARSER_END(Adder) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER: (<DIGIT>)+> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { double a; } { a = expr() { System.out.println("well-defined"); System.out.println(a); } <EOL> | <EOL> | <EOF> { System.out.println("well-defined"); System.exit(-1); } } double expr(): { Token t; Token t1; } { t = <NUMBER> "+" t1 = <NUMBER> { return Double.parseDouble(t.toString()) + Double.parseDouble(t1.toString());} | t = <NUMBER> "-" t1 = <NUMBER> { return Double.parseDouble(t.toString()) - Double.parseDouble(t1.toString());} } | cs |
12. 곱셈을 추가한다. 곱셈은 덧셈, 뺄셈에 비해 우선 순위가 높다. 즉 먼저 처리되어야 한다. 곱셈에 대한 오퍼레이션을 별도로 만들어야 한다. 식을 곱셈과 나머지 식으로 분해한다고 생각하고 오퍼레이션을 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | options { LOOKAHEAD=2; } PARSER_BEGIN(Adder) public class Adder { public static void main(String args[]) throws ParseException{ Adder parser = new Adder(System.in); while(true) { parser.parseOneLine(); } } } PARSER_END(Adder) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER: (<DIGIT>)+> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { double a; } { a = expr() { System.out.println("well-defined"); System.out.println(a); } <EOL> | <EOL> | <EOF> { System.out.println("well-defined"); System.exit(-1); } } double expr(): { double a; double b; } { a = term()("+" b = expr(){a += b;} | "-" b = expr(){a-= b;} )*{return a;} } double term(): { double a; double b; Token t; } { t = <NUMBER> { a = Double.parseDouble(t.toString()); } ("*" b = term() {a *=b;} | "/" b = term() { a /= b ; } )* {return a;} } | cs |
13. 음수가 앞에 나오는 경우도 고려하여 프로그램을 수정하라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | options { LOOKAHEAD=2; } PARSER_BEGIN(Adder) public class Adder { public static void main(String args[]) throws ParseException{ Adder parser = new Adder(System.in); while(true) { parser.parseOneLine(); } } } PARSER_END(Adder) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER: (<DIGIT>)+> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { double a; } { a = expr() { System.out.println("well-defined"); System.out.println(a); } <EOL> | <EOL> | <EOF> { System.out.println("well-defined"); System.exit(-1); } } double expr(): { double a; double b; } { a = term()("+" b = expr(){a += b;} | "-" b = expr(){a-= b;} )*{return a;} } double term(): { double a; double b; } { a = unary()("*" b = term() {a *=b;} | "/" b = term() { a /= b ; } )* {return a;} } double unary(): { Token t; double a; } { t = <NUMBER> { a= Double.parseDouble(t.toString()); return -a; } | t = <NUMBER> { return Double.parseDouble(t.toString()); } } | cs |
14. 식이 가로로 묶여 있는 경우도 고려하여 앞의 프로그램을 수정하라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | options { LOOKAHEAD=2; } PARSER_BEGIN(Calculator) public class Calculator { } PARSER_END(Calculator) SKIP : { " " | "\r" | "\t" } TOKEN: { < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? > | < DIGIT: ["0"-"9"] > } double expr(): { } { term() ( "+" expr() | "-" expr() )* } double term(): { } { unary() ( "*" term() | "/" term() )* } double unary(): { } { "-" element() | element() } double element(): { } { <NUMBER> | "(" expr() ")" } | cs |
JavaCC API 계산기 예제 결과 확인하기
15. 정의된 문법을 예를 들어 보면 다음과 같다. 1 + 2*3
[자바 설치 문법] 정의된 문법의 예
16. 1 +(2*3 + 1) -1이 문법에 맞는지 검사하라.
17. 2/3 + 3*4가 문법에 맞는지 검사하라.
18. javacc Arithmetic.jj를 실행한다.
[자바 사칙연산 API] javacc Arithmetic.jj를 실행
19. 정상적으로 컴파일되면 다음과 같이 action을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | options { LOOKAHEAD=2; } PARSER_BEGIN(Calculator) public class Calculator { public static void main(String args[]) throws ParseException{ Calculator parser = new Calculator(System.in); while(true){ parser.parseOneLine(); } } } PARSER_END(Calculator) SKIP: { " " | "\r" | "\t" } TOKEN: { <NUMBER:(<DIGIT>)+("."(<DIGIT>)+)?> | <DIGIT:["0"-"9"]> | <EOL: "\n"> } void parseOneLine(): { double a; } { a = expr() <EOL> {System.out.println(a);} | <EOL> | <EOF> {System.exit(-1);} } double expr(): { double a; double b; } { a = term()("+" b = expr(){a+=b;} | "-" b = expr(){a-=b;} )*{return a;} } double term(): { double a; double b; } { a = unary()("*" b = term() {a *=b;} | "/" b = term() { a /= b ; } )* {return a;} } double unary(): { double a; } { "-" a = element(){return -a;} | a = element(){return a;} } double element(): { Token t; double a; } { t = <NUMBER> {return Double.parseDouble(t.toString());} | "(" a = expr() ")" {return a;} } | cs |
20. javacc Calculator.jj를 하여 파일을 생성한다.
21. java Calculator를 하여 계산을 수행한다.
[JavaCC 강좌] 자바CC 설치, 사용법, 문법, API, 계산기 예제