实验1 词法分析

格式说明:排版时注意按此模板的字体,字号和行距。

报告提交和打印输出时请去掉此框。

实验一、词法分析实验

商软1班   周展鹏  201506110114

一、        实验目的

 

     通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

二、        实验内容和要求

在原程序中输入源代码

  • 对字符串表示的源程序
  • 从左到右进行扫描和分解
  • 根据词法规则
  • 识别出一个一个具有独立意义的单词符号
  • 以供语法分析之用
  • 发现词法错误,则返回出错信息

在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

(1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。

(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。

(3) 常数  常数的类型一般有整型、实型、布尔型、文字型等。

(4) 运算符 如+、-、*、/等等。

(5) 界符  如逗号、分号、括号、等等。

各种单词符号对应的种别码。

输出形式:

  • 二元式

– (单词种别,单词自身的值)

  • 单词种别,表明单词的种类,语法分析需要的重要信息

– 整数码

  • 关键字、运算符、界符:一符一码
  • 标识符:10, 常数:11
  • 单词自身的值

三、        实验方法、步骤及结果测试

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名×××.c

可执行程序名:×××.exe

 

  1. 2.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

  1. 3.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

package CompilePrograme;

import java.awt.List;
import java.util.Scanner;

public class Compile {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        double startTime = System.currentTimeMillis();
        final int MAX_LEN = 100;
        Scanner input = new Scanner(System.in);

        System.out.print("Please input a string <end with ‘#‘>:");
        String uString = input.nextLine();
        input.close();

        String[] keyWords = new String[] { "begin", "if", "then", "while", "do", "end" };

        char[] analyseData = new char[MAX_LEN];

        int index = 0, key = 0;
        List list = new List();

        do {
            String compareStr = null;
            char temp = uString.charAt(index);
            list = extactCharacters(temp, analyseData, keyWords, uString, index, compareStr);
            if (list.getItemCount() == 0) {
                index++;
                continue;
            }
            // 规定List的第一个元素为index,第二个元素为key
            index = Integer.parseInt(list.getItem(0));
            key = Integer.parseInt(list.getItem(1));
            String words = list.getItem(2);
            System.out.println("< " + key + " ," + words + " >");
        } while (key != 0);
        double endTime = System.currentTimeMillis();
        System.out.println("\nProgram running time is :" + (endTime - startTime));
    }

    public static List extactCharacters(char temp, char[] analyseDate, String[] keywords, String uString, int index,
            String compareStr) {

        int keyID = -1, m = 0;
        // index--;
        List list = new List();
        // 1.判断下一个读入的字符是否为空格,用while作为大循环,若读取到空格则跳出方法,提取下一个字符进行判断
        while (temp != ‘ ‘) {
            // 2.判断当前字符是字母或者数字和字母的组合
            if (temp >= ‘a‘ && temp <= ‘z‘) {
                m = 0;

                // 当读取到不是大小写字母或者数字时候判断为一个单词读取完成
                while (temp >= ‘a‘ && temp <= ‘z‘ || temp >= ‘A‘ && temp <= ‘Z‘ || temp >= ‘0‘ && temp <= ‘9‘) {
                    analyseDate[m++] = temp;
                    compareStr += temp + "";
                    temp = uString.charAt(++index);
                }

                compareStr = compareStr.substring(4);
                // 与读取出来的字符判断是否为关键字
                for (int i = 0; i < 6; i++) {
                    if (compareStr.equals(keywords[i])) {
                        keyID = i + 1;
                        list.add(index + "");
                        list.add(keyID + "");
                        list.add(compareStr);
                        return list;
                    }
                }
                // 不是关键字就当作为标识符
                keyID = 10;
                list.add(index + "");
                list.add(keyID + "");
                list.add(compareStr);
                return list;
            }
            // 3,判断当前字符是数字?
            else if (temp >= ‘0‘ && temp <= ‘9‘) {
                m = 0;
                String tempTokens = null;
                // 对后面的字符进行判断是否为数字
                while (temp >= ‘0‘ && temp <= ‘9‘) {
                    analyseDate[m++] = temp;
                    tempTokens += temp;
                    temp = uString.charAt(++index);
                }
                // 不是数字则返回种别码,结束当前方法
                keyID = 11;
                tempTokens = tempTokens.substring(4);
                list.add(index + "");
                list.add(keyID + "");
                list.add(tempTokens + "");
                return list;
            }
            m = 0;
            // 4.判断当前字符是其他关系运算符
            String token = null;
            switch (temp) {
            case ‘<‘:
                // String token = null;
                analyseDate[m++] = temp;
                token += temp;
                if (uString.charAt(++index) == ‘=‘) {
                    analyseDate[m++] = temp;
                    keyID = 22;
                    token += uString.charAt(index++);
                } else if (uString.charAt(++index) == ‘>‘) {
                    analyseDate[m++] = temp;
                    keyID = 21;
                    token += uString.charAt(index++);
                } else {
                    keyID = 23;
                }
                list.add(index + "");
                list.add(keyID + "");
                token = token.substring(4);
                list.add(token);
                return list;
            case ‘>‘:
                // String tokens = null;
                analyseDate[m++] = temp;
                token += temp;
                if (uString.charAt(++index) == ‘=‘) {
                    keyID = 24;
                    analyseDate[m++] = temp;
                    token += uString.charAt(index++);
                } else {
                    keyID = 20;
                }
                list.add(index + "");
                list.add(keyID + "");
                token = token.substring(4);
                list.add(token);
                return list;
            case ‘:‘:

                analyseDate[m++] = temp;
                token += temp;
                if (uString.charAt(++index) == ‘=‘) {
                    keyID = 18;
                    // analyseDate[m++] = temp;
                    analyseDate[m++] = uString.charAt(index);
                    token += uString.charAt(index++);
                } else {
                    keyID = 17;
                }
                list.add(index + "");
                list.add(keyID + "");
                token = token.substring(4);
                list.add(token);
                return list;
            case ‘*‘:
                keyID = 13;
                break;
            case ‘/‘:
                keyID = 14;
                break;
            case ‘+‘:
                keyID = 15;
                break;
            case ‘-‘:
                keyID = 16;
                break;
            case ‘=‘:
                keyID = 25;
                break;
            case ‘;‘:
                keyID = 26;
                break;
            case ‘(‘:
                keyID = 27;
                break;
            case ‘)‘:
                keyID = 28;
                break;
            case ‘#‘:
                keyID = 0;
                break;
            default:
                keyID = -1;
                break;
            }
            analyseDate[m++] = temp;
            list.add(++index + "");
            list.add(keyID + "");
            list.add(temp + "");
            return list;
        }
        return list;
    }
}
  1. 1.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

 

 

 

一、        实验总结

心得体会,实验过程的难点问题及其解决的方法。
时间: 2024-12-28 02:48:53

实验1 词法分析的相关文章

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

实验一词法分析报告

实验一.词法分析实验 专业:商业软件工程三班       姓名:郑锦诚      学号:201506110198 一.        实验目的 词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 二.        实验内容和要求 让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出. 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文

哈工大软件学院编译原理实验1——词法分析

这次实验被"过来人"们定位非常easy,实验内容例如以下: ----------------------------------------------------------------------------------- 对例如以下工作进行展开描写叙述 (1) 给出语言的词法规则描写叙述 · 标识符.keyword.整常数.字符常数.浮点常数 · 单界符:+,-,×,;,- · 双界符:/*,:=,>=,<=,!=,- · 凝视 (2) 针对这样的单词的状态转换图和程

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

实验一 词法分析实验报告

实验一.词法分析实验 专业:商业软件工程2班  姓名 别博文  学号201606110175 一. 实验目的        编制一个词法分析程序. 二. 实验内容和要求 对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息.. 三. 实验方法.步骤及结果测试  源程序名:压缩包文件(rar或zip)中源程序名 ceshi.c 可执行程序名:ceshi.exe 主要程序段及其解释: 实现主要功能的程序段,重

0930 实验一 词法分析

一.实验目的: 编写一个词法分析程序 二.实验要求: ①输入源程序字符串 ②输出二元组(种别,单词符号本身) 三.各种单词符号对应的种别码(删减版) 四.程序代码 1 #include<stdio.h> 2 #include<string.h> 3 void F(char c,char b); 4 void word(char a[]); 5 void number(char a[]); 6 int i; //定义全局变量i 7 int s=1; //用来记录是否存在非法字符 8

实验一词法分析试验报告

实验一.词法分析实验 专业:商业软件工程   姓名:林海鑫  学号:201506110120 一.        实验目的 (1)掌握词法分析程序的实现方法. (2)用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术. (3)理解词法分析在编译程序中的作用. (4)加深对有穷自动机模型的理解. 二.        实验内容和要求 1,词法分析程序的功能(输入,输出). 2,待分析的简单语言的词法. 3,各种单词符号对应的种别码. 三.        实验方法.步

实验一 词法分析程序实验

实验一.词法分析程序实验 商业软件工程   蓝海鹏  201506110171 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 实验内容: 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)*(标识符) 10 >=