티스토리 뷰

목차

    반응형

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

    반응형