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语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...
随机推荐
- Bootstrap,导航栏点击效果修复(补)
前言: 昨天晚上休息,忘记发博客了.对于学习这件是,还是需要坚持的.想想自建一个Jekyll博客模版还是很兴奋的,话不多说,看正文吧! 关于开发: 先看个Demo吧,点这里.你会发现,点击是没有效果 ...
- 每天一道LeetCode--389. Find the Difference
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...
- 一个页面多Table多分页的问题
一个页面有多个table,多个pagination,一个pagerForm.这种情况下怎么解决多个pagination不同pagenum的问题呢? 如果是这样的滴话,使用局部刷新就可以了,两个tabl ...
- HTML、JS、CSS之特殊字符
可能这是冷知识了,并不为多数人知道像HTML.JS.CSS它们的特殊字符的写法,我也是在网上收录的在这里make一下: 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HT ...
- win7 开启休眠
使用cmd命令进行开启,首先点击开始菜单,在“搜索程序和文件”中输入“cmd”,然后点击回车键.如下: 2 弹出如下图的界面,在其中最后的地方输入“powercfg -hibernate on”,然后 ...
- asp.net中c# TextBox.MaxLength例子
TextBox.MaxLength 属性获取或设置文本框中最多允许的字符数文本框中最多允许的字符数.默认值为 0,表示未设置该属性.使用 MaxLength 属性限定可以在 TextBox 控件中输入 ...
- 实例介绍Cocos2d-x精灵菜单和图片菜单
精灵菜单类是MenuItemSprite,图片菜单类是MenuItemImage.由于MenuItemImage继承于MenuItemSprite,所以图片菜单也属于精灵菜单.为什么叫精灵菜单呢?那是 ...
- Eclipse+GitHub
之前一直想研究github的使用,但一直没时间,今天抽空学习了一下,发现真的是非常好用!!! 准备材料 1.你要有最新版的Eclipse(不要问我为什么要最新版的,反正我用的是最新版本) 2.一个gi ...
- 分享10款功能强大的HTML5/CSS3应用插件
1.纯CSS3美化Checkbox和Radiobox按钮 外观很时尚 利用CSS3我们可以打造非常具有个性化的用户表单,今天我们就利用CSS3美化Checkbox复选框和Radiobox单选框.CSS ...
- BigInteger大数家法源代码及分析
我们可以把一个很大很长的数分成多个短小的数,然后保存在一个数组中,大数之间的四则运算及其它运算都是通过数组完成.JDK就是这么实现的.JDK的BigInteger类里用一个int数组来保存数据: /* ...