0917 词法分析程序(java版)

1.程序说明:

c语言和java两个版本的都做了一次,略作比较后觉得虽然用的语言不一样,但是中心思想都是一样的。本程序(java版)思路是先把源代码程序存入一个大字符串中,

然后分析该字符串,按照不同的词法分拆成一个个小字符串存到一个字符串数组中去,接着识别一些关键词,并对应相应的种别码,利用循环体一一列出。而对于c语言的

版本,笔者的思路是:由于C语言没有字符串类型,所以先把源代码输入到一个字符数组中去,然后按照词法截取单词或符号,逐一存到一个结构体数组中去,由于需要一

个个字符操作,要用到较多的循环体,所以速度相对较慢,相信有更好的思路,笔者还想琢磨一下,所以就不发表C语言版了。

2.发现问题和不足:

一开始觉得这个程序很小,可能会太简单,但实际操作起来发现也会出现很多问题,甚至包括一些很低级的错误。还有就是程序本身具有一定的局限性,能识别的关键词

有限,能输入的格式有限,还有其他一些细节上的问题,要想做得更好就仍需慢慢修改。打代码就像种花,有时真的急不来,在保证效率的同时也需要耐心。

3.运行结果:

4.源代码:

package 词法分析;
import java.util.Scanner;
public class fenxi {public static void main(String[] args) {   //主函数

Scanner scanner=new Scanner(System.in);
int k=0,i=0;
String[] word=new String[20];
word[0]="";
System.out.println("请输入一个程序(以‘#‘结束):");
String sent=scanner.nextLine();
// System.out.println(sent);
judgeType(k, i, word, sent);//判断分析组成类型
justOne(word);//只有一个英文字母的特殊情况统一为"l(l|d)*"
outPut(word);
}

private static void justOne(String[] word) {//判断是否有单个字母的特殊情况
int i = 0,k = 0;
while(word[i]!= null){
if(word[i]!=""){
if(Character.isLetter(word[i].charAt(0))&&word[i].length()==1){
word[i]="l(l|d)*";
k++;
if(k>1)
word[i]="NULL";//不要重复的
}
}
i++;
}
}

private static void outPut(String[] word) { //对应种别码,并输出列表
int i = 0;
System.out.println("单词符号\t\t\t"+"种别码");
while(word[i]!=null){
switch(word[i]){
case "begin":
System.out.println(word[i]+"\t\t\t"+"1");
break;
case "if":
System.out.println(word[i]+"\t\t\t"+"2");
break;
case "then":
System.out.println(word[i]+"\t\t\t"+"3");
break;
case "while":
System.out.println(word[i]+"\t\t\t"+"4");
break;
case "do":
System.out.println(word[i]+"\t\t\t"+"5");
break;
case "end":
System.out.println(word[i]+"\t\t\t"+"6");
break;
case "l(l|d)*":
System.out.println(word[i]+"\t\t\t"+"7");
break;
case "dd*":
System.out.println(word[i]+"\t\t\t"+"8");
break;
case "+":
System.out.println(word[i]+"\t\t\t"+"9");
break;
case "-":
System.out.println(word[i]+"\t\t\t"+"10");
break;
case "*":
System.out.println(word[i]+"\t\t\t"+"11");
break;
case "/":
System.out.println(word[i]+"\t\t\t"+"12");
break;
case ":":
System.out.println(word[i]+"\t\t\t"+"13");
break;
case ":=":
System.out.println(word[i]+"\t\t\t"+"14");
break;
case "<":
System.out.println(word[i]+"\t\t\t"+"15");
break;
case "<=":
System.out.println(word[i]+"\t\t\t"+"16");
case "<>":
System.out.println(word[i]+"\t\t\t"+"17");
break;
case ">":
System.out.println(word[i]+"\t\t\t"+"18");
break;
case ">=":
System.out.println(word[i]+"\t\t\t"+"19");
break;
case "=":
System.out.println(word[i]+"\t\t\t"+"20");
break;
case ";":
System.out.println(word[i]+"\t\t\t"+"21");
break;
case "(":
System.out.println(word[i]+"\t\t\t"+"22");
break;
case ")":
System.out.println(word[i]+"\t\t\t"+"23");
break;
case "#":
System.out.println(word[i]+"\t\t\t"+"24");
break;
case "for":
System.out.println(word[i]+"\t\t\t"+"25");
break;
}
i++;
}
}

private static void judgeType(int k, int i, String[] word, String sent) {
while(sent.charAt(k)!=‘#‘){
word[i]="";
while(Character.isLetter(sent.charAt(k))){//是否为字母
word[i]=word[i]+sent.charAt(k);
k++;

}
i++;
word[i]="";

//是否为连续的运算符
while((sent.charAt(k)==‘<‘||sent.charAt(k)==‘>‘||sent.charAt(k)==‘=‘||sent.charAt(k)==‘:‘)&&(sent.charAt(k+1)==‘<‘||sent.charAt(k+1)==‘>‘||sent.charAt(k+1)==‘=‘||sent.charAt(k+1)==‘:‘)){
word[i]=""+sent.charAt(k)+sent.charAt(k+1);
i++;
k=k+2;
word[i]="";
}

//是否为单个符号或运算符
while(sent.charAt(k)==‘(‘||sent.charAt(k)==‘)‘||sent.charAt(k)==‘;‘||sent.charAt(k)==‘:‘||sent.charAt(k)==‘+‘||sent.charAt(k)==‘-‘||sent.charAt(k)==‘*‘||sent.charAt(k)==‘/‘||sent.charAt(k)==‘<‘||sent.charAt(k)==‘>‘||sent.charAt(k)==‘=‘){
word[i]=""+sent.charAt(k);
k++;
i++;
word[i]="";
}

while(sent.charAt(k)==‘ ‘){//是否为空格
// System.out.println("space");
word[i]="NULL";
k++;
i++;
word[i]="";
}

while(Character.isDigit(sent.charAt(k))){//是否为数字
word[i]="dd*";
k++;
i++;
word[i]="";
}

}

word[i]=""+‘#‘;
// System.out.println("跳出循环"+word[i]+i);
}
}

时间: 2024-11-05 01:17:32

0917 词法分析程序(java版)的相关文章

应用程序初次运行数据库配置小程序(Java版)

应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的时候自动部署数据库和导入一些初始化数据.然后就有了以下的思路: 在应用程序入口处判断数据库是否已经配置完成,若配置完成则进入正常的登录系统完成正常操作即可,若未配置则进入数据库配置的小程序完成数据库配置然后再进入系统,但如何来判断是否已经配置完成呢,在这里我用的是比较原始的方法,配置数据库的时候系统

java版的QQ小程序

转载自:http://blog.csdn.net/lihongxun945/article/details/6114290 这是一个简单的java版的QQ小程序. 包括一个简单的服务器和一个简单的客户端. 运行时,先运行服务器,然后在运行客户端,就可以进行聊天了. 默认的配置是localhost,端口4545,更改ip就可以在两天电脑上进行聊天了. 目前不支持内网和外网之间的访问,也不支持多人聊天. 因为这只是一个简单的例子,感兴趣的同学可以通过改进,实现多人聊天和内外网之间的访问. 效果图:

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

Java版菠菜程序搭建BC网站项目开发给演示站包网小白的一些意见

Java版程序是目前世界上公认的高安全性扩展性最好,页面反馈速度极佳的BC网站搭建程序语言,在菲律宾,柬埔寨等东南亚国家,对Java版菠菜程序搭建的网站运营是由衷放心的特别是一些集团公司.在做BC网站项目之前,需要Q先分析3530自己的实际2742情况55,了解自己想要去做的具体方向,打算如何运营,团队如何去组建(网站一个人是运营不起来的),如果这些你都没有清楚的认识那我劝你还是别做了,应为做了对你来说没有具体的运营方向也就没办法运营好,运营不好的网站对你来说根本一文不值.考虑好了网站的运营方向

pureMVC java版搭建流程

转自:http://blog.csdn.net/sutaizi/article/details/6588004 pureMVC 是一个轻量级的框架 它在 flex中非常流行(和cairngorm差不多火) 目前几乎已经移植到所有平台上. 下面实现java版得pureMVC搭建 先给大家看总体的层次: 众所周知 pureMVC是一个轻量级的MVC框架 分为 Model ,View ,Controller.这三个是pureMVC的核心. 除此之外pureMVC中含有一个单例模式Facade.faca

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

微信公众平台深度开发JAVA版第二季视频教程

微信公众平台深度开发JAVA版第二季(九宝饭店微信点餐系统)视频教程下载密码:qa4a     联系QQ:1026270010 微信作为当前流行的通信社交软件有了上亿的用户量,几乎每一个只能手机都要安装微信.但是,市场上对于JAVA开发微信公众平台的资料却少之又少,多数的资料一般是其他语言的.因此,主讲老师经过潜心研究.认真准备,录制了这套针对JAVA开发语言的微信公众平台开发教程. 1.课程研发环境 开发语言:JAVA WEBServer:TOMAT DATABASE:MySQL 开发工具:m

JAVA版StarDict星际译王简单实现

由胡正开发的星际译王是Linux平台上很强大的一个开源的翻译软件(也有Windows版本的)支持多种词库.多种语言版本.尤其词库设计比较合理.之前看到一篇博文<星际译王词库应用-自制英汉词典>中用简短的程序就实现了词典的基本功能,不过那个是Linux 下的C/C++版本的,于是决定参考移植一个JAVA版本. import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream;

Java版贪吃蛇小游戏的实现

使用的IDE eclipse JDK版本 1.6 辅助类 Coordinate.java package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other