使用Java语言编写PL/0编译程序的词法分析程序
时间: 2024-02-15 21:03:01 浏览: 103
精选_毕业设计_基于Java实现的PL/0文法分析器-词法分析、语法分析、语义分析_完整源码
下面是一个使用 Java 语言编写的 PL/0 编译程序的词法分析程序:
```java
import java.io.*;
public class Lexer {
private BufferedReader reader;
private char currentChar;
private int currentPos;
private Token currentToken;
public Lexer(String fileName) throws IOException {
reader = new BufferedReader(new FileReader(fileName));
currentPos = 0;
nextChar();
}
public Token getNextToken() throws IOException {
while (currentChar != 0) {
if (Character.isWhitespace(currentChar)) {
skipWhitespace();
continue;
}
if (Character.isDigit(currentChar)) {
return getNumber();
}
switch (currentChar) {
case '+':
nextChar();
return new Token(TokenType.PLUS, "+");
case '-':
nextChar();
return new Token(TokenType.MINUS, "-");
case '*':
nextChar();
return new Token(TokenType.TIMES, "*");
case '/':
nextChar();
return new Token(TokenType.SLASH, "/");
case '(':
nextChar();
return new Token(TokenType.LPAREN, "(");
case ')':
nextChar();
return new Token(TokenType.RPAREN, ")");
case ';':
nextChar();
return new Token(TokenType.SEMI, ";");
case '.':
nextChar();
return new Token(TokenType.PERIOD, ".");
case ':':
nextChar();
if (currentChar == '=') {
nextChar();
return new Token(TokenType.ASSIGN, ":=");
} else {
return new Token(TokenType.COLON, ":");
}
case ',':
nextChar();
return new Token(TokenType.COMMA, ",");
default:
throw new IOException("Invalid character: " + currentChar);
}
}
return new Token(TokenType.EOF, "");
}
private void nextChar() throws IOException {
currentPos++;
int next = reader.read();
currentChar = (char) next;
}
private void skipWhitespace() throws IOException {
while (Character.isWhitespace(currentChar)) {
nextChar();
}
}
private Token getNumber() throws IOException {
StringBuilder sb = new StringBuilder();
do {
sb.append(currentChar);
nextChar();
} while (Character.isDigit(currentChar));
return new Token(TokenType.NUMBER, sb.toString());
}
}
```
在这个词法分析程序中,我们通过 `BufferedReader` 对象读取输入文件,并通过 `nextChar` 方法逐个读取字符。通过 `getNextToken` 方法,我们不断循环,直到遇到文件结尾或者识别到一个词法单元。在循环中,我们首先判断当前字符是否为空白字符,如果是,就跳过它。接着,我们判断当前字符是否为数字,如果是,就调用 `getNumber` 方法来获取一个数字词法单元。如果当前字符是其他符号,则根据其类型返回相应的词法单元。如果当前字符是一个非法字符,则抛出异常。最后,如果整个文件已经读取完毕,则返回一个 EOF 词法单元。
在 `getNumber` 方法中,我们使用 `StringBuilder` 来动态构建数字字符串,直到读取到一个非数字字符为止。最后,我们返回一个 NUMBER 词法单元,其中保存了数字字符串。
阅读全文