java正则表达式实现简单词法分析

需要识别的词

1. 关键字:if、int、for、while、do、return、break、continue;单词种别码为1。

2. 标识符;单词种别码为2。

3. 常数为无符号整形数;单词种别码为3。

4. 运算符包括:+、-、*、/、=、、<、=、<=、!= ;单词种别码为4。

5. 分隔符包括:,、;、{、}、(、); 单词种别码为5。

6. 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:

7. ID=letter(letter | digit)*

8. NUM=digit digit*


代码:


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;




public class Realize {

public static void main(String[] args) {
// TODO Auto-generated method stub
String FilePath = "E://a.txt";
Valid valid = new Valid();
boolean isValid =valid.isValid(FilePath);
if(isValid) {
Read read = new Read();
String str = read.readTxt(FilePath);
Tool tool = new Tool();
tool.tool1(str);
tool.tool2(str);
tool.tool3(str);
tool.tool4(str);
tool.tool5(str);
tool.tool6(str);
tool.tool7(str);
} else {
System.out.println("该文件不是txt文件,无法识别!");
}
}


}


class Tool {
public void tool1(String str) {
//识别关键字:if、int、for、while、do、return、break、continue;
String regex = "(if|int|for|while|do|return|break|continue)";
//1.if、int、for、while、do、return、break、continue;
//单词种别码为1。
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"1,"+"“"+matcher.group()+"”"+")");//(2,”main”)
}
}

public void tool2(String str) {
//识别标识符
String regex = "[A-Za-z_$]+[A-Za-z_$\\d]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"2,"+"“"+matcher.group()+"”"+")");
}
}

public void tool3(String str) {
//常数为无符号整形数
String regex = "[0-9][0-9]*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"3,"+"“"+matcher.group()+"”"+")");
}
}

public void tool4(String str) {
//运算符包括:+、-、*、/、=、、<、=、<=、!= 
String regex1 = "[+|-|*|/]";
String regex2 = "(?<!(<|!))=";//匹配等号,过滤"<="和"!="中的等号
String regex3 = "(<)(?!=)";//匹配"<",过滤"<="中的“<”
String regex4 = "(<|!|!)=";
Pattern pattern1 = Pattern.compile(regex1);
Pattern pattern2 = Pattern.compile(regex2);
Pattern pattern3 = Pattern.compile(regex3);
Pattern pattern4 = Pattern.compile(regex4);
Matcher matcher1 = pattern1.matcher(str);
Matcher matcher2 = pattern2.matcher(str);
Matcher matcher3 = pattern3.matcher(str);
Matcher matcher4 = pattern4.matcher(str);
while(matcher1.find()) {
System.out.println("("+"4,"+"“"+matcher1.group()+"”"+")");
}
while(matcher2.find()) {
System.out.println("("+"4,"+"“"+matcher2.group()+"”"+")");
}
while(matcher3.find()) {
System.out.println("("+"4,"+"“"+matcher3.group()+"”"+")");
}
while(matcher4.find()) {
System.out.println("("+"4,"+"“"+matcher4.group()+"”"+")");
}
}

public void tool5(String str) {
//匹配分隔符包括:,、;、{、}、(、)
String regex = "(\\,|\\;|\\{|\\}|\\(|\\))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"5,"+"“"+matcher.group()+"”"+")");
}
}

public void tool6(String str) {
//匹配7.ID=letter(letter | digit)*
String regex = "[A-Za-z]+[A-Za-z\\d]?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"6,"+"“"+matcher.group()+"”"+")");
}
}

public void tool7(String str) {
//匹配7.ID=letter(letter | digit)*
String regex = "[0-9]{1,}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("("+"7,"+"“"+matcher.group()+"”"+")");
}
}

}


class Valid {
public boolean isValid(String FilePath) {  
String allowType = ".txt";
        if (null == FilePath || "".equals(FilePath)) {  
            return false;  
        }   
            if (FilePath.indexOf(allowType) > -1) {  
                return true;  
            }
            else {
            return false; 
            }
    }  
}


class Read {
public String readTxt(String filePath) {
String str = null;
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8")); 
// 指定读取文件的编码格式,要和写入的格式一致,以免出现中文乱码,
while ((str = reader.readLine()) != null) {
return str;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于Java实现简单词法分析器和语法分析器 基于Java实现简单词法分析器和语法分析器是一个基础的编译器前端项目,旨在帮助开发者理解编译器的前端部分是如何工作的。以下是一个简化的项目介绍,描述了如何使用Java实现这两个分析器。 ### 项目介绍: **目标**:使用Java实现一个简单词法分析器和语法分析器。 **主要任务**: 1. **词法分析器**: - 定义词法规则,包括关键字、标识符、常数、运算符和分隔符等。 - 使用Java正则表达式或有限自动机理论实现词法分析器,能够将源代码转换为词法单元序列。 - 处理词法错误,如非法字符或格式错误的数字。 2. **语法分析器**: - 定义语法规则,构建上下文无关文法(CFG)。 - 使用Java的递归下降解析器或LL(1)解析器实现语法分析器,能够将词法单元序列转换为抽象语法树(AST)。 - 处理语法错误,如语法错误和类型错误。 **技术要求**: - 熟悉Java编程语言。 - 了解编译原理中的词法分析、语法分析概念。 - 熟悉有限自动机理论和抽象语法树。 **开发工具**: - Java编译器,如OpenJDK。 - 代码编辑器或IDE,如IntelliJ IDEA、Eclipse。 ### 适合人员: - 计算机科学或相关领域的学生:此项目能够帮助他们实践编译原理Java编程知识。 - 软件开发者:特别是那些对编译器和解释器如何工作感兴趣的程序员。 - 语言处理领域的研究者:此项目可以作为自然语言处理和编译技术的一个研究起点。 ### 额外建议: - 从一个简单的语言子集开始,逐步增加支持的语法和语义特性。 - 使用单元测试来验证分析器的正确性。 - 编写详细的文档,记录设计决策和实现细节,便于项目维护和他人理解。 通过实现这样一个编译器前端,学生可以深入理解编译器的工作原理,提高Java编程技能,并为进一步学习编译原理和编程语言理论打下基础。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是一个很好的实践机会。
词法分析程序生成器实现正则表达式、NFA、DFA、DFA最小化词法分析程序 词法分析程序生成器是一个工具,它能够根据给定的正则表达式自动生成词法分析器。这个生成器通常包括以下几个步骤:正则表达式的转换、NFA(非确定性有限自动机)的构建、DFA(确定性有限自动机)的构建、DFA的最小化,以及最终生成词法分析程序。以下是一个基于这个概念的项目介绍。 ### 项目介绍: **目标**:实现一个能够将正则表达式转换为词法分析程序的生成器。 **主要任务**: 1. **正则表达式解析**: - 实现一个解析器,用于解析复杂的正则表达式。 - 将正则表达式转换为内部表示,如抽象语法树(AST)。 2. **NFA构建**: - 根据正则表达式的内部表示,构建对应的NFA。 - 实现NFA的状态和转换函数。 3. **DFA构建**: - 将NFA转换为等价的DFA。 - 实现DFA的状态和转换函数。 4. **DFA最小化**: - 实现DFA的最小化算法,如Hopcroft算法。 - 简化DFA的状态和转换函数。 5. **词法分析程序生成**: - 根据最小化的DFA,生成可执行的词法分析程序代码。 - 生成代码应该能够读取源代码,并输出词法单元。 **技术要求**: - 熟悉正则表达式、有限自动机理论和算法。 - 掌握编译原理中的词法分析概念。 - 熟悉至少一种编程语言(如Java、C++、Python等)。 **开发工具**: - 代码编辑器或IDE(例如Visual Studio Code, Eclipse, IntelliJ IDEA等)。 - 编程语言(Java、C++、Python等)。 ### 适合人员: - **计算机科学或相关领域的学生**:此项目能够帮助他们实践编译原理和理论计算机科学的知识。 - **软件开发者**:特别是那些对编译器设计和自动化工具感兴趣的程序员。 - **研究者**:在编译技术、程序分析或语言处理领域的研究者。 ### 额外建议: - 从简单正则表达式和NFA开始,逐步增加复杂度。 - 使用单元测试和集成测试来验证生成器的正确性。 - 编写详细的文档,记录设计决策、实现细节和测试结果。 - 考虑使用版本控制系统(如Git)来管理项目代码。 通过这个项目,开发者不仅能够深入理解编译器构建的过程,还能够提高对程序语言的理解和编程技能。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是一个很好的实践机会。
首先,词法分析器的主要任务是将输入的代码(源文件)逐个字符解析成一个个的单词(Token),并将这些单词进行分类,最终输出一个单词流(Token Stream)。 在Java中,可以使用正则表达式和有限自动机(Finite Automata)来实现词法分析器。以下是一个简单Java代码示例: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class Lexer { private String input; private int index; private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("[a-zA-Z]+"); private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+"); public Lexer(String input) { this.input = input; this.index = 0; } public Token getNextToken() { // 跳过空格和换行 while (index < input.length() && (input.charAt(index) == ' ' || input.charAt(index) == '\n')) { index++; } // 判断是否到达输入结尾 if (index == input.length()) { return new Token(TokenType.EOF, ""); } // 匹配标识符 Matcher identifierMatcher = IDENTIFIER_PATTERN.matcher(input.substring(index)); if (identifierMatcher.lookingAt()) { String identifier = identifierMatcher.group(); index += identifier.length(); return new Token(TokenType.IDENTIFIER, identifier); } // 匹配数字 Matcher numberMatcher = NUMBER_PATTERN.matcher(input.substring(index)); if (numberMatcher.lookingAt()) { String number = numberMatcher.group(); index += number.length(); return new Token(TokenType.NUMBER, number); } // 无法识别的字符 char unrecognizedChar = input.charAt(index); index++; return new Token(TokenType.UNRECOGNIZED, Character.toString(unrecognizedChar)); } } ``` 在上述代码中,我们定义了一个Lexer类,用于存储输入的源文件内容和当前处理到的位置。我们使用正则表达式定义了IDENTIFIER_PATTERN和NUMBER_PATTERN,用于匹配标识符和数字。getNextToken()方法会解析下一个单词,并返回对应的Token对象。 以上代码示例仅为一个简单词法分析实现,实际应用中可能需要更复杂的逻辑来处理不同的语言特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值