实验一、词法分析实验

商业软件工程专业   张树恒  201506110093

一、实验目的

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

二、实验内容和要求

在原程序中输入源代码

对字符串表示的源程序

从左到右进行扫描和分解

根据词法规则

识别出一个一个具有独立意义的单词符号

以供语法分析之用

发现词法错误,则返回出错信息

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

识别关键字:main if int for while do return break continue,该类的单词码为1.

识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.

运算符:+、-、*、/、=、>、=、<=、!=

分隔符:,、;、{、}、(、)

常数,如123,4587

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

输出形式:

二元式

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

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

–     整数码

关键字、运算符、界符:一符一码

标识符:10, 常数:11

单词自身的值

–     标识符token、常数sum

–     关键字、运算符、界符token

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

1.源程序名:编译原理实验报告中源程序名算法分析.c

可执行程序名:编译原理实验报告.exe

2.原理分析及流程图

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

import java.awt.*;

import java.util.Scanner;

/**

* Created by s2002 on 2016/9/30.

*/

public class com {

public static void main(String[] args) {

//限制字符串最大值

final int MAX_LEN = 100;

//关键字

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

//录入用户输入

Scanner input = new Scanner(System.in);

System.out.print("Please input a string :");

String uString = input.nextLine();

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, key_word, 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);

}

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

String compareStr) {

int keyID = -1, m = 0;

List list = new List();

//判断下一个读入的字符是否为空格,若读取到空格则跳过,提取下一个字符进行判断

while (temp != ' ') {

//判断当前字符是字母或者数字和字母的组合

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

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;

}

//判断当前字符是否为数字

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;

//判断当前字符是否为其他关系运算符

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 '>':

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;

}

}

4.运行结果及分析

输入源代码:begin x:=0; end#

符合个字符的单词码

四、实验总结

学会编写一个简单的词法分析程序,学会了利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,对代码的理解更加的深刻。

java词法分析器实验报告_词法分析器实验报告(JAVA)相关推荐

  1. 南邮java大作业实验报告_南京邮电大学java第三次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  2. 光纤传感器实验模块_光纤传感器实验报告.doc

    <传感器原理>课程实验 光强调制型光纤位移传感器测量位移和粗糙度实验 一.实验目的: 了解光纤位移传感器的工作原理 了解光纤位移传感器的输出特性 加深对传感器一些主要静态性能指标的理解 二 ...

  3. mysql索引 实验报告_索引实验报告

    学 生 实 验 报 告 课程名称 商务数据库应用 实验成绩 实验项目名称 索引 批阅教师 实验者 学号 专业班级 实验日期 2012-12-6 一.实验预习报告(实验目的.内容,主要设备.仪器,基本原 ...

  4. mysql的安全性实验报告_数据库实验报告3-SQL Server 安全性验证

    数据库实验报告 JNU本科实验报告专用纸 课程名称 数据库上机实验 成绩评定 实验项目名称 SQL Server 安全性验证 指导教师 实验项目编号 08060113 实验项目类型 验证性 实验地点 ...

  5. 眼图观测实验报告_眼图实验报告.docx

    眼图实验报告 眼图实验报告 篇一:基带信号眼图实验实验报告 通信原理实验报告 实验名称:数字基带信号的眼图实验 实验时间:XX年12月11日 指导老师: 应娜 学 院: 计算机学院 班 级网络工程) ...

  6. 光纤传感器实验模块_光纤传感器实验报告

    格式 专业资料整理 实验报告评分: 09 级 6 系姓名:安森松学号 :PB09210345 实验题目: 光纤传感器 实验目的: 掌握干涉原理,自行制作光线干涉仪,使用它对某些物理量进行测量, 加深对 ...

  7. 单片机广告灯实验总结_单片机实验三(广告灯实验)分析报告.ppt

    微机原理与接口技术(A)实验三 广告灯实验 1.状态信息窗口 2.程序区与数据区 3.智能一键通 4.智能一键通设置状态窗口 5.文件更新按钮 6.复位目标板 7.操作状态窗口 8.菜单与工具条 9. ...

  8. 数据结构三元组实验报告_数据结构实验报告

    实验一 约瑟夫问题 实验学时: 3 学时 实验类型:设计 实验要求:必修 一.实验目的 熟练掌握线性链表的基础知识: 能够使用 C++ 或其他程序设计语言编程实现线性链表: 能够使用线性链表构造正确而 ...

  9. java编写三角形问题_软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序...

    实验报告 实验内容: 1.Install Junit(4.12), Hamcrest(1.3) with Eclipse 2.Install Eclemma with Eclipse 3.Write ...

最新文章

  1. 孩子、老人与海豚,如何用 AI 伴他们走出孤独
  2. JDK 16 GA 发布,你还停留在JDK 8吗?
  3. swift 语言 linux,苹果发布Swift 2.2编程语言:支持Ubuntu Linux系统
  4. ajax formdata提交上传,Ajax提交用FormData()上传文件
  5. 一段文字,写给合唱团即将分别的我们
  6. 将前端文件和Go程序打包
  7. python3安装_Python 3.8.2安装教程
  8. c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法
  9. 微信开发,调用js-SDK接口
  10. 位置变量示例_shell脚本
  11. php正则判断括号中的,PHP实现正则匹配所有括号中的内容
  12. Android蓝牙打印机打印图片文字
  13. python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波
  14. win10连不上网,“网络重置”后,网络适配器出现感叹号,右下角WLAN消失,网络连接是空白。
  15. 为什么 call 比 apply 快?
  16. 爬虫晋江小说python_python 爬虫入门之爬小说
  17. 【Windows】Windows下通过图形界面安装MySQL数据库
  18. python抓取经典评论_通过Python抓取天猫评论数据
  19. Android数据加密DES、3DES、AES
  20. dokuwiki登录设置

热门文章

  1. 2020-1-19 2.港股打新、REITs和分拆
  2. 海量吞吐的实时NoSQL—HBase的七剑和20151111圣战(数据脱敏版)
  3. 1.2 小红书的红利期过了吗?【玩赚小红书】
  4. 数据升维到希尔伯特空间
  5. linux gdb添加符号表,gdb – 什么是符号表,它如何集成到可执行文件中?
  6. NCBI数据库文件扩展名解析
  7. 一级市场与二级市场,谁是韭菜,谁是收割韭菜?
  8. acme.sh申请免费SSL证书,泛域名证书,多域名证书
  9. 看过了你就知道怎么泡妞了
  10. 防火墙下面的找不到专用网络设置,并且域网络、专用网络是灰的关不掉