参考:http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html

实现了一个简单的java词法分析器

功能:词法分析下面一段java小程序

 int sum = 0; for(int i = 1; i <= 100; i = i + 1) sum += i;#

1.程序片段中使用到的关键字、运算符和界符:

关键词:

Int for

运算符:

+ =

界符:

( ) <= #

2.单词和单词种别码设计

单词符号

种别码

Int

1

For

2

Letter(letter|digit)*

3

Digit|digit*

4

*

5

/

6

+

7

-

8

>

9

>=

10

<

11

<=

12

=

13

;

14

(

15

)

16

#

17

词法分析器源代码

 package com.gxf.lexical;

 import java.util.Scanner;

 public class Lexical {
String input = ""; //源程序
String keyWords[] = {"int", "for"}; //关键词
int point = 0; //全局指针指向源程序
int syn = 0; //单词种别码
int sum = 0; //数字的总和
StringBuffer token = new StringBuffer(""); //存放单词 public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Lexical lexical = new Lexical(); lexical.input = scanner.nextLine();
// System.out.println(lexical.input);//输入源程序
scanner.close(); do{
lexical.scanner();
switch(lexical.syn){
case 4:
System.out.println("(" + lexical.syn + "," + lexical.sum + ")");
break;
default:
System.out.println("(" + lexical.syn + "," + lexical.token + ")");
break;
}
}while(lexical.syn != 17);
} /**
* 词法分析器
*/
public void scanner(){
//将单词置为空
token = new StringBuffer();
while(' ' == input.charAt(point))
point++; //去掉空格
if((input.charAt(point) >= 'a' && input.charAt(point) <= 'z') ||
(input.charAt(point) >= 'A' && input.charAt(point) <= 'Z')){//关键词或者标识符
syn = 3;//种别码为3
while((input.charAt(point) >= 'a' && input.charAt(point) <= 'z') ||
(input.charAt(point) >= 'A' && input.charAt(point) <= 'Z') ||
(input.charAt(point) >= '0' && input.charAt(point) <= '9')){
token.append(input.charAt(point));
point++;
}
// point--;//后退一个位置
for(int i = 0; i < keyWords.length; i++){
if(keyWords[i].equals(String.valueOf(token))){
syn = i + 1;//修改种别码
break;
}
}
}//if
else if(input.charAt(point) >= '0' && input.charAt(point) <= '9'){//如果是数字
syn = 4;
sum = 0;
while(input.charAt(point) >= '0' && input.charAt(point) <= '9'){
sum = sum * 10 + (input.charAt(point) - '0');
point++;
}
//point--;//后退一个字符
}//else if
else{//其他字符
switch(input.charAt(point)){
case '>'://大于符号
token = new StringBuffer(">");//重置token
point++;
if(input.charAt(point) == '='){
token.append("=");
syn = 10;
}else{
syn = 9;
point--;
}
point++;
break;
case '<':
token = new StringBuffer("<");
point++;
if(input.charAt(point) == '='){
token.append("=");
syn = 12;
}else{
syn = 11;
point--;
}
point++;
break;
case '*':
token = new StringBuffer("*");
syn = 5;
point++;
break;
case '/':
token = new StringBuffer("/");
syn = 6;
point++;
break;
case '+':
token = new StringBuffer("+");
syn = 7;
point++;
break;
case '-':
token = new StringBuffer("-");
syn = 8;
point++;
break;
case ';':
token = new StringBuffer(";");
syn = 14;
point++;
break;
case '(':
token = new StringBuffer("(");
syn = 15;
point++;
break;
case ')':
token = new StringBuffer(")");
syn = 16;
point++;
break;
case '#':
token = new StringBuffer("#");
syn = 17;
point++;
break;
case '=':
token = new StringBuffer("=");
syn = 13;
point++;
break;
} }
}
}

注意程序片段要以#号结束

其实,上面参考的博客写得还不错可以看看

java 词法分析器的更多相关文章

  1. Java语言词法分析器

    一.实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别 ...

  2. Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

  3. JVM从入门开始深入每一个底层细节

    1 官网 1.1 寻找JDK文档过程 www.oracle.com -> 右下角Product Documentation -> 往下拉选择Java -> Java SE docum ...

  4. JVM 学习笔记(一)

    一:jvm架构图解 我们经常关注的jdk和jre如图所示: jre包含在jdk中,这里说一下jdk和jre的作用 JRE是Java Runtime Environment的缩写,是Java程序的运行环 ...

  5. JVM-虚拟机执行子系统

    类的加载由JVM执行引擎来完成 早期--编译期:源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析 ...

  6. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  7. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  8. Java编写的C语言词法分析器

    Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...

  9. 用Java语言实现简单的词法分析器

    编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...

随机推荐

  1. 真机调试时提示: could not change executable permissions on the application

    原因:同一个bundle identifier不能重复在两个app中使用: 解决:卸载掉手机上的另一个app即可重新安装.

  2. xhtml+css基础知识1

    样式 行间样式:在标签里 <div style="width:400px; height:200px; background:red;">块</div> 内 ...

  3. js实现全屏

    详细内容请点击 1.window.open方式 第一种: 在已经打开的一个普通网页上,点击“全屏显示”,然后进入该网页对应的全屏模式.方法为:在网页的<body>与</body> ...

  4. 邮箱格式验证demo

    <html> <head> <script type="text/javascript"> function validate_email(fi ...

  5. shell中使用echo命令改变输出显示样式

    文本终端的颜色可以使用“ANSI非常规字符序列”来生成.举例:echo -e "\033[44;37;5m ME \033[0m COOL" 以上命令设置背景成为蓝色,前景白色,闪 ...

  6. 项目中重新引用WCF报错

    今天在一个项目里,重新更新WCF引用的时候,居然报错了,提示根本找不到那个WCF接口,我赶紧跑去新建了一个空项目,试着用相同的地址引用一下,发现是可以的,完全ok 既然是虚惊一场,那就得想办法把这个W ...

  7. 转: Python集合(set)类型的操作

    python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...

  8. 10款强大的jQuery/HTML5应用新鲜出炉

    1.CSS3/jQuery自定义弹出窗口 多种弹出动画 这是一款利用jQuery和CSS3实现的自定义弹出窗口,这可比浏览器默认的弹出窗口漂亮多了.弹出窗口中可以自定义html,十分灵活.另外最重要的 ...

  9. java 自动装箱和自动拆箱

    自动装箱 java执行Integer i = 100:编译器编译成Integer i = Integer.valueOf(100); Integer i = 100; //编译器编译成Integer ...

  10. Winfrom皮肤样式的使用

    IrisSkin类库提供了可供我们使用的设置窗体皮肤的类,简单地说,就是给我们提供了一个皮肤引擎,通过设置皮肤引擎来达到我们想要的窗体界面. 具体的开发步骤: (1)引入IrisSkin.dll文件 ...