编译原理 SysY语言的词法分析程序

本文介绍了如何使用Java编写SysY语言的词法分析程序,详细描述了保留字、标识符、运算符和分界符的识别规则,并通过多个测试用例展示程序的运行结果。

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

  1. 实验目的与内容
    对SysY语言进行词法分析,可以查出语言中可能包含的词法错误。
    从控制台输入字符串,如有出错则输出错误,没有错误则按照二元组的方式输出
  2. 设计方法
    对SysY语法进行分析如下:
    (1) 保留字: if else for while do continue return break int const main void
      注意:所有关键词都是小写的。
    (2) 标识符ID,与标准C语言一致,即:以下划线或字母开头的字母数字下划线组成的符号串。
    (3)运算符和分界符: +、-、*、/、% 、==、!=、<、>、<=、>= 、!、&&、|| 、(、)、{、}、[、]。
    (4) 空白符包括空格、制表符和换行符,用于分割标识符、保留字、运算符和分界符,词法分析阶段要忽略空白符。
    本程序使用Java编写
    程序启动输入后,字符串保留在instr中。先对字符串进行预处理,去除两个词之间多余的空格,再按空格进行切割。切割完成后逐个单词进行判断,分别判断是否属于保留字、数字、运算符和分界符等等,如果匹配成功则输出。每次判断时使用token逐个读取字符串的各个字符直到一个单词结束并且进行判断。
package cn.hdu;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Word {
   //1.词法分析程序


    public static boolean IsLetter(char ch){
   
        if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))
            return true;
        return false;
    }

    //判断是否为数字
    public static boolean IsDigit(char ch)
    {
   
        if (ch >= '0'&&ch <= '9')
            return true;
        return false;
    }

    //判断是否为分界符
    public static int IsSymbol(char ch)
    {
   
        char symbol[]= {
    '(',')',',',';','<','>','{','}','[',']'};
        for (int i = 0; i < 8; i++)
        {
   
            if (ch == symbol[i])
                return i;
        }
        return -1;
    }

    //判断是否为关键字
    public static int IsKeyword(String str)
    {
   
        String keyword[] = {
   "if","else","for","while","do", "continue", "return", "break" ,"int", "const", "main", "void" };
        for (int i = 0; i < keyword.length; i++)
        {
   
            if (str.equals(keyword[i]) )
            {
   
                return i;
            }
        }
        //不是关键字即为标识符
        return 30;
    }


    public static boolean IsRight(String str)
    {
   
        char[] chars = str.toCharArray();
       // System.out.println(chars.length);
        int f = 0;
        //for (int i = 0; i < str.length()-1; i++)
        //{
   
           /* if (IsLetter(chars[i]) ||"_".equals( chars[i]))
                f=1;*/
                if (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值