728 250 상단


JAVACC 사용법과 예제 2 [계산기 예] 자바 계열



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


15. 정의된 문법을 예를 들어 보면 다음과 같다. 1 + 2*3

 

정의된 문법의 예정의된 문법의 예


16. 1 +(2*3 + 1) -1이 문법에 맞는지 검사하라.

17. 2/3 + 3*4가 문법에 맞는지 검사하라.

18. javacc Arithmetic.jj를 실행한다.


javacc Arithmetic.jj를 실행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를 하여 계산을 수행한다.



출처: http://codingcoding.tistory.com/17


핑백

덧글

댓글 입력 영역


250 250 스애드

반응형 사이드