编译原理,实验一简单的词法分析(java实现)

一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析。
二、词法分析器的功能
完成对源程序字符串的词法分析,输出形式是源程序的五类单词符号的二元式代码,并保存在文件中。
三、设计内容
选择以下三个任务之一,编写其词法分析程序。


1、初级任务
已知某语言标识符由小写字母、数字和下划线3中符号组成,起始字符为字母,结束符为字母或数字,且下划线字符两两不相连,对该标识符集,试写出描述它的正规式及DFA,编写识别它的程序。

在这里插入图片描述

分析需要实现的功能:

  • 1、开头只能为字母;2、字符串只能出现字母数字下划线;3、结尾只能是字母或数字;4、不能连续出现两个‘_’。
  • 这个初级任务还是比较简单的,我的思路是把输入的字符串存入数组,用for循环遍历,ASCII码进行判断这些条件,如果符合就返回true输出语句,不符合返回false
import java.util.Scanner;

// _的ASCII码:95
public class shiyan1_1 {
    private static int flag = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String s = sc.next();

        char[] chars = s.toCharArray();

        shiyan1_1.judge(s);
        if (shiyan1_1.judge(s) && chars[s.length()-1]!='_')
            System.out.println("输入正确:  "+s);
        else
            System.out.println("不合法的字符串!");
    }

    public static boolean judge(String s) {
        char[] chars = s.toCharArray();
        int flag = 0;
        int numSum = 0;

        if (chars[0] >= 65 && chars[0] <= 90 || chars[0] >= 97 && chars[0] <= 122)      //大小写字母
            for (int i = 0; i < chars.length; i++) {
                if(chars[i]>=65 && chars[i]<=90 || chars[i]>=97 && chars[i]<=122 || chars[i]==95 || chars[i]>=48 && chars[i]<=57){
                    numSum+=1;
                    if(chars[i]=='_'){
                        flag+=1;
                        if (flag == 2)
                            break;
                    }else flag=0;
                }
            }

        if (numSum == chars.length && flag < 2) {
            return true;
        }
        return false;
    }
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
词法分析编译器的第一个阶段,也是最基础的一步,其主要任务是将源代码转换为一个个单词或符号,即“词法单元”,以供后续阶段使用。下面我们来介绍如何设计编制调试一个词法分析程序。 1. 设计词法规则 在设计词法规则时,首先需要分析所处理的编程语言的语法结构和语法规则,然后将其转化为正则表达式或有限状态自动机等形式,以识别出程序中的各个词法单元。例如,在C语言中,整型常量的正则表达式为`[1-9][0-9]*|0`,表示可以是以非零数字开头的整数,也可以是0。 2. 编制词法分析程序 根据所设计的词法规则,编制词法分析程序,一般有两种方式实现: (1)手写程序 手写程序可以直接使用编程语言的字符串处理函数,如`substr()`、`charAt()`等,逐个字符进行匹配,判断其是否符合所设定的正则表达式。这种方式相对简单,但是需要大量的代码量和调试工作,不适合处理复杂的语法结构。 (2)使用词法分析生成器 词法分析生成器是一种自动生成词法分析程序的工具,常用的有flex、ANTLR等。使用词法分析生成器可以大大简化程序编写过程,只需要提供所设计的词法规则,即可自动生成词法分析程序。这种方式比较适合处理复杂的语法结构,并且可以提高程序的可维护性。 3. 调试词法分析程序 在编写完词法分析程序后,需要进行调试,以确保程序的正确性。主要的调试方法包括: (1)单步调试 单步调试可以逐步执行程序,查看每一步的执行结果,以确定程序的执行过程和问题所在。在单步调试时,可以使用调试器或者打印输出等方式进行调试。 (2)测试用例 编写测试用例,验证程序的正确性。测试用例应该包含各种情况下的输入输出,包括正常情况、边界情况、异常情况等,以尽可能全面地测试程序。 总之,词法分析编译器的重要组成部分,设计编制调试一个词法分析程序需要仔细分析所处理的编程语言的语法结构和语法规则,并且采用合适的方法进行实现调试,才能保证程序的正确性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值