File: demo.java

package info (click to toggle)
texlive-extra 2014.20141024-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,016,484 kB
  • ctags: 21,582
  • sloc: perl: 140,144; python: 16,926; makefile: 12,969; sh: 9,285; ansic: 3,415; java: 3,090; csh: 2,987; xml: 1,050; lisp: 630; ruby: 487; lex: 358; tcl: 142; sed: 36; pascal: 25; cpp: 18; awk: 10; haskell: 5
file content (68 lines) | stat: -rw-r--r-- 1,719 bytes parent folder | download | duplicates (6)
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
import java.io.IOException;
import java.io.Reader;
import java.util.Hashtable;
import java.util.Map;

public class Lexer
{
   private Reader in;
   private int x;
   
   private Map<String,Token.T> reserved =
      new Hashtable<String,Token.T>();
   
   public Lexer(Reader in) throws IOException
   {
      this.in = in;
      x = in.read();
      reserved.put("let", Token.T.LET);
      // acrescentar demais palavras reservadas
      // ...
   }

   public Token get() throws IOException
   {
      // retornar o próximo símbolo léxico do programa
      
      while (Character.isWhitespace(x))
         x = in.read();

      if (x == -1)
         return new Token(Token.T.EOF);
      
      if ((char)x == ',')
      {
         x = in.read();
         return new Token(Token.T.COMMA);
      }

      if (Character.isDigit(x))
      {
         StringBuilder builder = new StringBuilder();
         builder.append((char)x);
         while (Character.isDigit((x = in.read())))
            builder.append((char)x);
         return new Token(Token.T.INT, new Long(builder.toString()));
      }

      if (Character.isAlphabetic(x))
      {
         StringBuilder builder = new StringBuilder();
         builder.append((char)x);
         while (Character.isAlphabetic(x = in.read()) ||
                Character.isDigit(x) || (char)x == '_')
            builder.append((char)x);
         String s = builder.toString();
         Token.T t = reserved.get(s);
         if (t == null)
            return new Token(Token.T.ID, s);
         return new Token(t);
      }

      // completar demais tokens
      
      System.out.println("unexpectec char: <" + (char)x + ">");
      x = in.read();
      return get();
   }
}