java 词法分析器
参考: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 词法分析器的更多相关文章
- Java语言词法分析器
一.实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别 ...
- Java类编译、加载、和执行机制
Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...
- JVM从入门开始深入每一个底层细节
1 官网 1.1 寻找JDK文档过程 www.oracle.com -> 右下角Product Documentation -> 往下拉选择Java -> Java SE docum ...
- JVM 学习笔记(一)
一:jvm架构图解 我们经常关注的jdk和jre如图所示: jre包含在jdk中,这里说一下jdk和jre的作用 JRE是Java Runtime Environment的缩写,是Java程序的运行环 ...
- JVM-虚拟机执行子系统
类的加载由JVM执行引擎来完成 早期--编译期:源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- Java编写的C语言词法分析器
Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...
- 用Java语言实现简单的词法分析器
编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...
随机推荐
- selenium遍历控件集合
场景:需要重复增加地址栏信息,如果地址信息超过了5个就不开始增加 如图: 1.找到控件集合,在遍历每个子元素,在进行选择 1.先找到最外层的div的控件集合 2.外层的css定位为: int star ...
- 【ASP.NET基础】简单企业产品展示网站--产品编辑CRUD
摘要:本文记录创建一个小的.简单的产品网站的步骤. 一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎.Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEd ...
- Android 开源项目分类汇总
Android 开源项目分类汇总 Android 开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView ...
- Zend studio 12.5.1破解过程
开始学习php了 今天又安装了一下Zend 之前找了很久的教程终于成了 , 今天换了一台电脑需要重新安装一下 又点忘记了. 就讲这个过程写下来 1.安装zend studio 12.5.1.这个过程 ...
- XenCenter删除SR失败解决方法
到CLI下 查SR的UUID xe sr-list SR的uuid=e0571e72-f6c5-1c9e-4ad8-9817b2331f47 FORGET SR xe sr-forget uuid=e ...
- 理解C#系列 / 结束
结束 开始写的原因 因为不知道自己有多牛. 因为需要一个备忘录. 因为要把知识梳理清楚,以便机器学习. 结束写的原因 因为想知道自己有多牛,不是把知识统统都摆出来,而是运用知识去做出东西来. 即将开发 ...
- WCF之消息模式
请求/响应:所有操作的默认行为,在WSDL中表现为Input/Output元素. One_Way. 在WSDL中只有Input,没有回应(Output),所以没有异常报告. 单向操作只会在发出调用的瞬 ...
- linux 系统运行级别及修改[转]
Linux运行级别从0-6,共7个. 0:关机.不能将系统缺省运行级别设置为0,否则无法启动. 1:单用户模式,只允许root用户对系统进行维护. 2:多用户模式,但不能使用NFS(相当于Window ...
- OpenGL第6、7讲小结
因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...
- Android BroadcasetReceiver
ci@clinux:~/mp_mtk$ adb -s QGAEFYAAOFN7PNOB logcat PhoneReceiver:e *:S --------- beginning of system ...