编译原理实验一 -无符号数的词法分析程序

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 编译原理实验一 -无符号数的词法分析程序,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、实验目的和要求:

1.掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。

2.要求从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编

写程序识别出其中的无符号数

二、实验平台:

   Java语言

三、主要实验内容及结果:

实验内容:

词法分析的主要任务是:扫描源程序,识别单词,生成属性字。单词的种类一般分为四种:关键字、标识符、常数、特殊符号,无符号数是常数中的一种,无符号数的词法分析难点在于带指数的无符号数的识别。

无符号数文法规则可定义如下:

<无符号数>→<无符号实数>│<无符号整数>

<无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│

<无符号整数>E<比例因子>

<比例因子>→<有符号整数>

<有符号整数>→[+│-]<无符号整数>

<无符号整数>→<数字串>

<数字串>→<数字>{<数字>}

<数字>→0 │1 │2 │3…… │9

             程序代码:

import java.util.ArrayList;
import java.util.Scanner;
public class Unsigned {
    private ArrayList<Word> wordList;
    public static void main(String[] args) {
        Unsigned unsigned = new Unsigned();// 读入单词列表unsigned.inputWordList();// 识别单词列表for (Word word : unsigned.wordList) {// 识别单词unsigned.whichType(word);
            String temp = word.getCJ2();
            if (temp != null) {
                int index = temp.lastIndexOf(“.0”);
                if (index == temp.length() – 2)
                    word.setCJ2(temp.substring(0, index));
            }
        }// 输出单词列表unsigned.printWordList();
    }// 识别单词private void whichType(Word word) {
        int w = 0;
        int p = 0;
        int j = 0;
        int e = 1;
        int d = 0;
        String chars[] = word.getStr().split(“”);// 从第一个字符开始int i = 0;
        String current_char = chars[i];// 数字否?if (!isNum(current_char)) {
            word.setCJ1(“出错”);
            return;
        } else {
            while (true) {
                d = Integer.parseInt(current_char);
                w = w * 10 + d;
                current_char = chars[++i];// 数字否?if (isNum(current_char)) {
                    continue;
                } else {// ‘.’?if (current_char.equals(“.”)) {
                        current_char = chars[++i];// 数字否?if (!isNum(current_char)) {
                            word.setCJ1(“出错”);
                            return;
                        } else {
                            while (true) {
                                d = Integer.parseInt(current_char);
                                w = w * 10 + d;
                                j = j + 1;
                                current_char = chars[++i];// 数字否?if (isNum(current_char)) {
                                    continue;
                                } else {// ‘E’?if (current_char.equals(“E”)) {
                                        isE(current_char, chars, i, word, w, p, j, e, d);
                                        return;
                                    } else {// 退一字符word.setCJ1(“实型”);
                                        word.setCJ2((w * Math.pow(10, e * p – j)) + “”);
                                        return;
                                    }
                                }
                            }
                        }
                    } else {// ‘E’?if (current_char.equals(“E”)) {
                            isE(current_char, chars, i, word, w, p, j, e, d);
                            return;
                        } else {// 退一字符word.setCJ1(“整型”);
                            word.setCJ2((w * Math.pow(10, e * p – j)) + “”);
                            return;
                        }
                    }
                }
            }
        }
    }
    private void isE(String current_char, String[] chars, int i, Word word, int w, int p, int j, int e, int d) {
        current_char = chars[++i];// ‘-‘?if (current_char.equals(“-“)) {
            e = -1;
            current_char = chars[++i];// 数字否?if (isNum(current_char)) {
                while (true) {
                    d = Integer.parseInt(current_char);
                    p = p * 10 + d;
                    current_char = chars[++i];
                    if (isNum(current_char)) {
                        continue;
                    } else {// 退一字符word.setCJ1(“实型”);
                        word.setCJ2((w * Math.pow(10, e * p – j)) + “”);
                        return;
                    }
                }
            } else {
                word.setCJ1(“出错”);
                return;
            }
        } else {// ‘+’?if (current_char.equals(“+”)) {
                current_char = chars[++i];// 数字否?if (isNum(current_char)) {
                    while (true) {
                        d = Integer.parseInt(current_char);
                        p = p * 10 + d;
                        current_char = chars[++i];
                        if (isNum(current_char)) {
                            continue;
                        } else {// 退一字符word.setCJ1(“实型”);
                            word.setCJ2((w * Math.pow(10, e * p – j)) + “”);
                            return;
                        }
                    }
                } else {
                    word.setCJ1(“出错”);
                    return;
                }
            } else {// 数字否?if (isNum(current_char)) {
                    while (true) {
                        d = Integer.parseInt(current_char);
                        p = p * 10 + d;
                        current_char = chars[++i];
                        if (isNum(current_char)) {
                            continue;
                        } else {// 退一字符word.setCJ1(“实型”);
                            word.setCJ2((w * Math.pow(10, e * p – j)) + “”);
                            return;
                        }
                    }
                } else {
                    word.setCJ1(“出错”);
                    return;
                }
            }
        }
    }// 是否为数字private boolean isNum(String string) {
        return “0123456789”.contains(string);
    }// 读入单词列表private void inputWordList() {
        System.out.println(“12996 0269 0E Es265 ;要求从键盘上输入一串字符(包括字母、数字等),最后以“;”结束”);
        Scanner scanner = new Scanner(System.in);
        String temp = scanner.nextLine().replace(“;”, “”);
        scanner.close();
        String[] strs = temp.split(” “);
        wordList = new ArrayList<Word>();
        for (String str : strs) {
            Word word = new Word();
            word.setStr(str + “#”);
            wordList.add(word);
        }
    }// 输出单词列表private void printWordList() {
        for (Word word : wordList) {
            System.out.println(word.getStr() + “\t” + word.getCJ2() + “\t” + word.getCJ1());
        }
    }// 单词类private class Word {// str记原始单词private String str;// CJ1记类型private String CJ1;// CJ1记数值private String CJ2;
        public String getStr() {
            return str;
        }
        public void setStr(String str) {
            this.str = str;
        }
        public String getCJ1() {
            return CJ1;
        }
        public void setCJ1(String cJ1) {
            CJ1 = cJ1;
        }
        public String getCJ2() {
            return CJ2;
        }
        public void setCJ2(String cJ2) {
            CJ2 = cJ2;
        }
    }
}

运行结果:

 编译原理实验一 -无符号数的词法分析程序

四、心得体会

词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128219.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!