본문 바로가기
C++ 200제/코딩 IT 정보

[JavaCC 강좌] 자바CC 설치, 사용법, 문법, API, 계산기 예제

by vicddory 2017. 1. 17.

[JavaCC 강좌] 자바CC 설치, 사용법, 문법, API, 계산기 예제


JavaCC 설치


1. https://javacc.dev.java.net/[클릭]에 접속한다.


javacc 프로젝트 홈페이지[자바 계산기] javacc 프로젝트 홈페이지


2. javacc-5.0.zip을 다운받는다.


javacc 5.0 다운[자바 설치 문법] javacc 5.0 다운


3. C 디렉터리 아래에 압축을 푼다.


JavaCC 압축 해제 후[자바 사칙연산 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를 실행한다.


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, 계산기 예제

댓글