编译原理 词法分析器简单实现 java代码

本文介绍了词法分析在计算机科学中的角色,重点是使用Java实现词法分析器的过程。实验目的是让学生熟悉词法分析程序设计,并针对给定文法构建DFA。实验要求包括编写程序、设计报告和上机验证。提供的Java代码用于实现词法分析,读者可通过注释和DFA图理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。


实验目的


通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术,如何针对确定的有限状态自动机进行编程序;熟悉和掌握程序设计语言的语法分析程序的设计原理、熟悉和掌握算符优先分析方法。

实验要求


本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告);③要编写出完成相应任务的程序并在计算机上准确地运行;④实验结束后要写出上机实验报告。

实验题目


针对下面文法G(S):
S→ v = E
E→E+E│E-E│E*E│E/E│(E)│ v │ i
其中,v为标识符,i为整型或实型数。要求完成
① 使用自动机技术实现一个词法分析程序;
② 使用算符优先分析方法实现其语法分析程序,在语法分析过程中同时完成常量表达式的计算。

构建DFA


在这里插入图片描述


java代码


结合注释和DFA的图看就好了

package lab1;

import java.util.*;

/*
编号规定:
001:加法运算符
002:减法运算符
003:乘法运算符
004:除法运算符
005:左括号
013:右括号
008.标识符
010.整数
011.等号运算符
012.浮点数
014:错误字段
*/
public class lexicalAnalysis {
   
   
    private static char[] Code;//转化为字符数组
    public static ArrayList<String> tokens=new ArrayList<>();//用于之后的语法分析传值使用

    public static void main(String[] args) {
   
   
//        String s = "abc2@e=num2+12.3.23)*123-12.#";//输入符号串
        String s = "A1=1.2+3*(4-6/3)#";//表达式为A1=1.2+3*(4-6/3)
        StartLexicalAnalysis(s);
    }

    public static void StartLexicalAnalysis(String s) {
   
   //开始进行语法分析
        if (IsCode(s)) {
   
   //判断
        System.out.println("当前输入符号为:" + s.substring(0,s.length()-1));
        System.out.println("词法分析结果如下:");
        StartState(0, 0);
        }
    }
    private static boolean IsCode(String s){
   
   //判断源代码是否为空,为空则不能进行词法分析
        if (s.isEmpty()||s.toCharArray()[0]=='#') {
   
   
            System.out.println("源代码为空,无法进行词法分析!");
            return false;
        }
        else {
   
   
            Code = s.toCharArray();
            return true;
        }

    }

    private static void StartState(int basicPointer, int currentPointer)//状态0,初始状态
    {
   
   

        if (Code[currentPointer] == '#') {
   
   
            System.out.println("词法分析结束");
        }
        else if (IsEqual(Code[currentPointer]))//如果当前字符是等于号进入EqualState
        {
   
   
            EqualState(currentPointer);
        }
        else if (IsAdd(Code[currentPointer]))//如果当前字符是加号进入AddState
        {
   
   
            AddState(currentPointer);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值