为什么编译程序进行词法分析时不能查出拼错的保留字
时间: 2023-04-12 15:00:32 浏览: 144
这可能是因为编译器在进行词法分析时只会检查保留字的拼写是否正确,而不会检查保留字的语义是否正确。如果拼写错误的保留字与某个合法的标识符相同,编译器可能会将其误认为是标识符而不是保留字。此外,编译器可能会使用一些简单的启发式算法来快速确定输入中的标识符和保留字,这些算法可能会忽略一些细节,导致无法正确识别拼写错误的保留字。
相关问题
编译原理pl0词法分析程序变成词法分析程序生成代码
编译原理课程中,PL0语言的词法分析程序主要是识别和抽取程序代码中的各种单词和符号,以便进一步的语法分析和语义分析。为了将PL0词法分析程序转化成为生成代码的程序,我们可以按照以下步骤进行改写。
首先,需要将原有的PL0词法分析程序中的词法规则和识别算法整理出来,包括关键字、标识符、常量、分隔符、运算符等内容。然后,根据这些规则和算法,我们需要设计一个代码生成器,以便将识别到的单词和符号转化成相应的目标代码。
其次,我们需要定义一套代码生成规则,将词法分析程序中的各种单词和符号映射成目标机器代码。这个过程包括对于每个识别到的单词和符号进行语义分析,并生成相应的目标代码指令。
最后,在代码生成器中加入错误处理机制,以便在词法分析程序发现错误时能够生成相应的错误信息和处理代码。
通过以上步骤,我们可以将PL0词法分析程序改写成为生成代码的程序,实现对PL0语言程序的词法分析和目标代码生成功能。这样的程序可以作为编译器的重要组成部分,为进一步的语法分析和代码优化提供基础。
使用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 词法单元,其中保存了数字字符串。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)