start of new file
[IRC.git] / Robust / cup / java_cup / simple_calc / scanner.java
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 instream;
9
10   public scanner(java.io.InputStream is) throws java.io.IOException {
11     instream = is;
12   }
13   public scanner() throws java.io.IOException { 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
21     { next_char = instream.read(); }
22
23   /* initialize the scanner */
24   private void init()
25     throws java.io.IOException
26     { advance(); }
27
28   /* recognize and return the next complete token */
29   public Symbol next_token()
30     throws java.io.IOException
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(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 };