实验报告一

实验一、词法分析实验

专业:商业软件工程   姓名:梁耀  学号:201506110091

一、        实验目的

(1)    理解词法分析在编译程序中的作用。

(2)    加深对有穷自动机模型的理解。

(3)    掌握词法分析程序的实现方法。

(4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

二、        实验内容和要求

1,待分析的简单语言的词法

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

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;
    }
}

原文地址:https://www.cnblogs.com/liangyao111/p/6078060.html