KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > java_cup > simple_calc > scanner


1 // Simple Example Scanner Class
2

3 package java_cup.simple_calc;
4
5 import java_cup.runtime.Symbol;
6
7 public class scanner implements java_cup.runtime.Scanner {
8   final java.io.InputStream JavaDoc instream;
9
10   public scanner(java.io.InputStream JavaDoc is) throws java.io.IOException JavaDoc {
11     instream = is;
12   }
13   public scanner() throws java.io.IOException JavaDoc { this(System.in); }
14
15   /* single lookahead character */
16   protected int next_char = -2;
17
18   /* advance input by one character */
19   protected void advance()
20     throws java.io.IOException JavaDoc
21     { next_char = instream.read(); }
22
23   /* initialize the scanner */
24   private void init()
25     throws java.io.IOException JavaDoc
26     { advance(); }
27
28   /* recognize and return the next complete token */
29   public Symbol next_token()
30     throws java.io.IOException JavaDoc
31     {
32       if (next_char==-2) init(); // set stuff up first time we are called.
33
for (;;)
34         switch (next_char)
35       {
36         case '0': case '1': case '2': case '3': case '4':
37         case '5': case '6': case '7': case '8': case '9':
38           /* parse a decimal integer */
39           int i_val = 0;
40           do {
41             i_val = i_val * 10 + (next_char - '0');
42             advance();
43           } while (next_char >= '0' && next_char <= '9');
44         return new Symbol(sym.NUMBER, new Integer JavaDoc(i_val));
45
46         case ';': advance(); return new Symbol(sym.SEMI);
47         case '+': advance(); return new Symbol(sym.PLUS);
48         case '-': advance(); return new Symbol(sym.MINUS);
49         case '*': advance(); return new Symbol(sym.TIMES);
50         case '/': advance(); return new Symbol(sym.DIVIDE);
51         case '%': advance(); return new Symbol(sym.MOD);
52         case '(': advance(); return new Symbol(sym.LPAREN);
53         case ')': advance(); return new Symbol(sym.RPAREN);
54
55         case -1: return new Symbol(sym.EOF);
56
57         default:
58           /* in this simple scanner we just ignore everything else */
59           advance();
60         break;
61       }
62     }
63 };
64
Popular Tags