- 浏览: 342776 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
alafqq:
很好的一篇启蒙hashmap的文章;HASHTABLE的93行 ...
使用数组和链表实现hash表存储信息 -
小帅1127:
我擦,我还以为有什么大坑呢,这也写出来。。。
if..else if和if..if的区别 -
fncj:
转下http://www.dodoer.com
hadoop单机版搭建图文详解 -
yueshang520:
Spring注解原理的详细剖析与实现 -
fncj:
转下,谢谢http://www.whohelpme.com/b ...
Spring注解原理的详细剖析与实现
什么是词法?
所谓词法,源代码由字符流组成,字符流中包括关键字,变量名,方法名,括号等等符号,其中变量名要满足不能包括标点符号,不能以数字开头的数字与字母的字符串这个条件,对于括号要成对出现等等,这就是词法;
什么是词法分析?
词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
待分析的简单语言的词法:
1) 关键字
begin if then while do end
2) 运算符和界符
:= + - * / < <= > >= <> = ; ( ) #
3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
各种单词符号对应的种别编码
单词符号 |
种别码 |
单词符号 |
种别码 |
begin |
1 |
: |
17 |
if |
2 |
:= |
18 |
then |
3 |
< |
20 |
while |
4 |
<> |
21 |
do |
5 |
<= |
22 |
end |
6 |
> |
23 |
letter(letter|digit)* |
10 |
>= |
24 |
digitdigit* |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
词法分析程序的功能:
输入:所给文法的源程序字符串
输出:二元组(syn, token或sum)构成的序列。
syn为单词种别码;
token为存放的单词自身字符串;
sum为整形常数。
例如:对源程序begin x:=9;if x>0 then x:=2*x+1/3;end# 经词法分析后输出如下序列:(1,begin)(10,’x’) (18,:=) (11,9) (26,;) (2,if)……
流程图:
源码:
public class 词法分析 { /* 初始化数据 syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 */ static String prog; static char ch; static char[]token=new char[8]; static int syn,p,m,n,sum; static //关键字表的初值 String[] rwtable={"begin","if","then","while","do","end"}; /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //1、输入字符串 //prog="begin x:=9; if x>0 then x:=2*x+1/3;end #"; //1、从文件中读取字符串 prog=dofile.readFileByChars("src/data.txt"); //2、扫描输出 p=0; do{ scaner(); switch(syn){ case 11:System.out.print("("+syn+" , ");//单词符号:Digit digit* System.out.print(sum); System.out.println(")"); break; case -1:System.out.println("error!"); break; default: System.out.print("("); System.out.print(syn); System.out.print(" , "); String str=new String(token); System.out.print(str); System.out.println(")"); } }while(syn!=0); } //扫描程序 private static void scaner() throws IOException { // 1、初始化 for(int i=0;i<8;i++) token[i]=' '; // 2、读字母 ch=prog.charAt(p++); while(ch==' '){//如果是空格,则取下一个字符 ch=prog.charAt(p++); } // 3、开始执行扫描 // 1、是字母 // 读标识符,查保留字表 // 查到,换成属性字表,写到输出流 // 没查到, 查名表,换成属性字,写到输出流 if(ch>='a'&&ch<='z'){ m=0; //获取完整单词 while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')){ token[m++]=ch; ch=prog.charAt(p++); } token[m++]='\0'; --p; syn=10;//单词符号为letter(letter|digit)* //判断是哪个关键字 String newStr=new String(token); newStr=newStr.trim(); //System.out.println("newStr:"+newStr); for(n=0;n<6;n++){ //System.out.println("rwtable:"+rwtable[n]); if(newStr.equals(rwtable[n])){ syn=n+1; System.out.println("syn 的值是:"+syn); break; } } token[m++]='\0'; } // 2、是数字 // 取数字,查常量表,换成属性字表,写到输出流 else if(ch>='0'&&ch<='9'){ while(ch>='0'&&ch<='9'){ sum=sum*10+ch-'0'; ch=prog.charAt(p++); } --p; syn=11;//digitdigit* token[m++]='\0'; } // 3、是特殊符号 // 查特殊符号表,换成属性字。写到输出流 // 4、错误error // 4、是否分析结束 // 未结束,到2 // 结束,到出口 else switch(ch){ case'<': m=0; token[m++]=ch; ch=prog.charAt(p++); if(ch=='>'){ syn=21;//<> } else if(ch=='='){ syn=22;//<= token[m++]=ch; } else{ syn=20;//< --p; } break; case'>': token[m++]=ch; ch=prog.charAt(p++); if(ch=='='){ syn=24;//>= } else{ syn=23;//> --p; } break; case':': token[m++]=ch; ch=prog.charAt(p++); if(ch=='='){ syn=18;//:= token[m++]=ch; } else{ syn=17;//: --p; } break; case'+': syn=13;token[0]=ch;token[1]='\0';break; case'-': syn=14;token[0]=ch;token[1]='\0';break; case'*': syn=15;token[0]=ch;token[1]='\0';break; case'/': syn=16;token[0]=ch;token[1]='\0';break; case'=': syn=25;token[0]=ch;token[1]='\0';break; case';': syn=26;token[0]=ch;token[1]='\0';break; case'(': syn=27;token[0]=ch;token[1]='\0';break; case')': syn=28;token[0]=ch;token[1]='\0';break; case'#': syn=0;token[0]=ch;token[1]='\0';break; default: syn=-1; } File txt=new File("src/nihao.txt"); if(!txt.exists()){ txt.createNewFile(); } byte[] bytes=new byte[token.length];//定义一个长度与需要转换的char数组相同的byte数组 for(int i=0;i<bytes.length ;i++){//循环将char的每个元素转换并存放在上面定义的byte数组中 byte b=(byte)token[i];//将每个char转换成byte bytes[i]=b;//保存到数组中 } FileOutputStream fos; try { fos = new FileOutputStream(txt,true); fos.write(syn); fos.write(bytes); fos.close(); } catch (Exception e) { e.printStackTrace(); } } }
文件data.txt中的内容为:
begin x:=9; if x>0 then x:=2*x+1/3;end #
程序执行结果(控制台输出):
打开文件 src/data.txt 读取内容为:
beginx:=9;ifx>0thenx:=2*x+1/3;end#
syn 的值是:1
(1 , begin)
(10,x)
(18,:=)
(11,9)
(26,;)
syn的值是:2
(2,if)
(10,x)
(23,>)
(11,90)
syn的值是:3
(3,then)
(10,x)
(13,+)
(11,902)
(15,*)
(10,x)
(13,+)
(11,9021)
(16,)
(11,90213)
(26,;)
syn的值是:6
(6,end)
(0,#)
<!--EndFragment-->
发表评论
-
apache日志信息详解
2011-11-06 21:19 6319一、访问日志的格式 Apache内建了记录服务器 ... -
浏览器如何工作
2011-08-19 08:57 0http://taligarsiel.com/Projects ... -
编码实现用JDK中的Proxy实现springAOP功能
2011-08-18 15:04 792http://blog.csdn.net/iamtheevil ... -
Spring注解原理的详细剖析与实现
2011-08-14 23:09 84350本文主要分为三部分: ... -
Spring装配基本属性的原理分析与代码实现
2011-08-11 15:37 1481首先,做一个配置属性的基本测试。修改beans.xml,使引用 ... -
编码剖析Spring依赖注入的原理
2011-08-10 20:01 1868一、注入依赖对象 基本类型对象注入: <b ... -
Spring的三种实例化Bean的方法
2011-08-10 14:03 1Spring的三种实例化Bean的方法 1、 使用 ... -
Spring管理bean的原理自定义实现
2011-08-10 10:44 62441、Spring通过BeanDefinition管理基于S ... -
spring环境搭建与测试
2011-08-10 08:40 3473Chapter1、搭建与测试spring的环境 1、 ... -
java回调机制实现
2011-08-08 09:06 2107Java的接口支持提供了一种获得回调的等价功能的 ... -
log4j的使用与详细分析
2011-08-05 13:32 2692一、什么是log4j? http://logging.a ... -
log4j使用详解
2011-08-04 23:05 2http://logging.apache.org/log4j ... -
java解析XML的四种方法的学习与比较
2011-03-30 20:55 7295四种XML解析方法: ... -
自定义日志模块实现
2011-03-30 09:58 1167package wxy.XXXX.Utils; impo ... -
synchronized(this)
2011-03-29 09:17 70571、当两个并发线程访问同一个对象object中的这个synch ... -
详细解析Java中抽象类和接口的区别(转)
2011-03-24 23:48 976在Java语言中, abstract cl ... -
NIO学习笔记(三)---通道
2011-03-09 23:06 16051、通道基础 ... -
NIO学习笔记(2)--缓冲区
2011-03-09 18:20 9891、一个Buffer对象是固定数量的数据的容器。其作用是 ... -
封锁管理子系统模拟实现java版
2011-03-09 18:01 1247封锁管理子系统模拟实现 文件锁定 ... -
NIO学习笔记(一)I/O缓冲区操作
2011-03-07 20:04 1286上图简单描述了数据从外部磁盘向运行中的进程的内存区域移动的 ...
相关推荐
Java Socket实现QQ仿真是一个基于Java网络编程技术的项目,它旨在模拟QQ的基本功能,如用户登录、好友聊天等。在本项目中,Socket是核心组件,用于建立客户端和服务器之间的通信链路。以下是对这个项目及其相关知识...
用面向对象方法和面向对象程序设计语言,实现满足下述要求的一个高层建筑电梯活动 仿真程序。 问题域概述 某国际展览中心共 40 层,设有载客电梯10 部(用E0~E9 标识)。 限定条件 (1) 电梯的运行规则是: E0、E1...
在这个“用Java实现的仿真农场”项目中,我们可以通过编程技术来模拟一个虚拟的农场环境,使得用户能够体验到管理、养殖、收获等农场活动的乐趣。以下是一些关于这个主题的关键知识点: 1. **面向对象编程**:Java...
在本文中,我们将讨论数字电路仿真的Java实现,主要分析了软件仿真器件与真实硬件的区别,以及如何解决这些区别带来的影响。 数字电路仿真可以分为两种:一种是离散事件系统,另一种是连续时间系统。在这里,我们...
"基于Java内容仓库的仿真分析数据的管理" ...基于Java内容仓库的仿真分析数据管理是计算机辅助工程领域中的一种重要的数据管理方法,可以实现数据的高效管理和共享,提高仿真分析的效率和准确性。
在本文中,我们将探讨如何使用Java编程语言实现一个胰岛素泵的仿真模型。这个项目可能涉及模拟胰岛素泵的核心功能,如设定基础率、临时调整、餐前大剂量以及监控血糖水平等。 首先,我们需要定义胰岛素泵的主要组件...
另一方面,词法分析器的代码部分可能是用C、C++、Java或其他编程语言编写,用于处理特定的编程语言或硬件描述语言。它会定义一系列规则(正则表达式)来识别输入源代码中的关键字、标识符、常量、运算符等,并生成...
Java电梯仿真系统是一种基于编程技术实现的模拟电梯运行的软件模型。这个系统通常用于教学、研究或测试目的,帮助理解多线程、并发控制、事件驱动编程等核心计算机科学概念。在这个项目中,我们看到标签指出了其使用...
“仿真算法实现TSP问题之----蚁群算法(Java版)”这个标题表明我们将探讨一种基于仿真算法的解决方案,特别是针对旅行商问题(TSP, Traveling Salesman Problem)的蚁群算法(Ant Colony Optimization, ACO),并且这...
基于Java和Matlab的虚拟仿真实验系统的设计与实现
计算机操作系统课程设计-基于Java实现的可视化仿真实现Linux2.6进程管理与内存管理+源代码+文档说明+实验报告 可视化仿真实现Linux2.6进程管理与内存管理,计算机操作系统课程设计 摘要 为了检验自己的操作系统课程...
本项目专注于使用Java语言实现Modbus TCP/IP协议的读写功能,提供了两种不同的实现方案:jlibmodbus和modbus4j库。这两种库都是Java社区开发的开源工具,专门用于处理Modbus通信。 首先,我们来看jlibmodbus。...
这个Java实现是帮助理解Tomasulo算法工作原理的一个很好的实践示例。 在Java代码中,`tomasulo.java`可能是主要的实现类,它包含了Tomasulo算法的核心逻辑。`tommain.java`可能是主程序入口,负责启动和控制整个...
本资源提供了一套基于Java的航班显示系统仿真网络软件的设计与实现源码,包含43个文件,其中包括19个Class字节码文件,8个Java源代码文件,4个DOCX文档文件,4个JAR打包文件,以及3个文本文件。此外,还包括2个配置...
仿真技术的核心是计算机模拟,它利用计算机程序和数据来表示现实世界的系统或过程,以便研究、分析或培训。以下是关于仿真技术的详细介绍: 仿真类型 按时间分类:仿真可以分为实时仿真(与现实时间同步)和非实时...
操作系统课程设计基于Java实现的仿真Linux系统源码+项目说明文档(满分),代码注释拉满,满分大作业资源,新手也可看懂,期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为课程设计...
标题中的“类似iBooks的3D...为了深入了解这个项目,需要查看这些文件,包括Java类、纹理图像、配置文件等,从而分析其实现细节和架构设计。对于想要学习或研究3D仿真翻页效果的开发者来说,这是一个很好的实践案例。
"仿真算法实现TSP问题之----Hopfield神经网络算法(Java版)--优化2" 这个标题表明我们关注的是一个基于Java实现的 Hopfield神经网络算法,用于解决旅行商问题(TSP)。旅行商问题是一个经典的组合优化问题,目标是...