-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLexer.java
More file actions
147 lines (133 loc) · 4.63 KB
/
Lexer.java
File metadata and controls
147 lines (133 loc) · 4.63 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Lexer.java
// Lexical analyzer for S
import java.io.*;
public class Lexer {
private char ch = ' ';
private BufferedReader input;
private final char eolnCh = '\n';
private final char eofCh = '\004';
static boolean interactive = false;
public Lexer (String fileName) { // source filename
try {
input = new BufferedReader (new FileReader(fileName));
}
catch (FileNotFoundException e) {
System.out.println("File not found: " + fileName);
System.exit(1);
}
}
public Lexer ( ) { // from standard input
input = new BufferedReader (new InputStreamReader(System.in));
}
private char getchar() { // Return next char
int c = 0;
try {
c = input.read();
if (c == -1)
c = eofCh;
} catch(IOException e) { System.err.println(e);}
return (char) c;
}
public Token getToken( ) { // Return next token
do {
if (Character.isLetter(ch)) { // ident or keyword
String s = "";
do {
s += ch;
ch = getchar();
} while (Character.isLetter(ch) || Character.isDigit(ch));
return Token.idORkeyword(s);
}
if (Character.isDigit(ch)) { // number
String s = "";
do {
s += ch;
ch = getchar();
} while (Character.isDigit(ch));
return Token.NUMBER.setValue(s);
}
switch (ch) {
case ' ': case '\t': case '\r':
ch = getchar();
break;
case eolnCh:
ch = getchar();
if (ch == '\r') // for Windows
ch = getchar(); // for Windows
if (ch == eolnCh && interactive)
return Token.EOF;
break;
case '/': // divide
ch = getchar();
if (ch != '/') return Token.DIVIDE;
do {
ch = getchar();
} while (ch != eolnCh);
ch = getchar();
break;
case '\"': // string literal
String s ="";
while ((ch = getchar()) != '\"')
s += ch;
ch = getchar();
return Token.STRLITERAL.setValue(s);
case eofCh:
return Token.EOF;
case '+': ch = getchar();
return Token.PLUS;
case '-': ch = getchar();
return Token.MINUS;
case '*': ch = getchar();
return Token.MULTIPLY;
case '(': ch = getchar();
return Token.LPAREN;
case ')': ch = getchar();
return Token.RPAREN;
case '{': ch = getchar();
return Token.LBRACE;
case '}': ch = getchar();
return Token.RBRACE;
case '[': ch = getchar();
return Token.LBRACKET;
case ']': ch = getchar();
return Token.RBRACKET;
case ';': ch = getchar();
return Token.SEMICOLON;
case ',': ch = getchar();
return Token.COMMA;
case '&': ch = getchar();
return Token.AND;
case '|': ch = getchar();
return Token.OR;
case '=': ch = getchar();
if (ch != '=') return Token.ASSIGN;
else {ch = getchar(); return Token.EQUAL;}
case '<': ch = getchar();
if (ch != '=') return Token.LT;
else {ch = getchar(); return Token.LTEQ;}
case '>': ch = getchar();
if (ch != '=') return Token.GT;
else {ch = getchar(); return Token.GTEQ;}
case '!': ch = getchar();
if (ch != '=') return Token.NOT;
else {ch = getchar(); return Token.NOTEQ;}
} // switch
} while (true);
} // next
public void error (String msg) {
System.err.println("Error: " + msg);
// System.exit(1);
}
static public void main (String[] args) {
Lexer lexer;
if (args.length == 0)
lexer = new Lexer( );
else
lexer = new Lexer(args[0]);
Token tok = lexer.getToken( );
while (tok != Token.EOF) {
System.out.println(tok.toString());
tok = lexer.getToken( );
}
} // main
}