java 词法分析器

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

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

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

1 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

词法分析器源代码

  1 package com.gxf.lexical;
  2
  3 import java.util.Scanner;
  4
  5 public class Lexical {
  6     String input = "";                                        //源程序
  7     String keyWords[] = {"int", "for"};                        //关键词
  8     int point = 0;                                            //全局指针指向源程序
  9     int syn = 0;                                            //单词种别码
 10     int sum = 0;                                            //数字的总和
 11     StringBuffer token = new StringBuffer("");                //存放单词
 12
 13     public static void main(String[] args) {
 14         Scanner scanner = new Scanner(System.in);
 15         Lexical lexical = new Lexical();
 16
 17         lexical.input = scanner.nextLine();
 18 //        System.out.println(lexical.input);//输入源程序
 19         scanner.close();
 20
 21         do{
 22             lexical.scanner();
 23             switch(lexical.syn){
 24                 case 4:
 25                     System.out.println("(" + lexical.syn + "," + lexical.sum + ")");
 26                     break;
 27                     default:
 28                         System.out.println("(" + lexical.syn + "," + lexical.token + ")");
 29                     break;
 30             }
 31         }while(lexical.syn != 17);
 32     }
 33
 34     /**
 35      * 词法分析器
 36      */
 37     public void scanner(){
 38         //将单词置为空
 39         token = new StringBuffer();
 40         while(‘ ‘ == input.charAt(point))
 41             point++;                                        //去掉空格
 42         if((input.charAt(point) >= ‘a‘ && input.charAt(point) <= ‘z‘) ||
 43                 (input.charAt(point) >= ‘A‘ && input.charAt(point) <= ‘Z‘)){//关键词或者标识符
 44             syn = 3;//种别码为3
 45             while((input.charAt(point) >= ‘a‘ && input.charAt(point) <= ‘z‘) ||
 46                     (input.charAt(point) >= ‘A‘ && input.charAt(point) <= ‘Z‘) ||
 47                     (input.charAt(point) >= ‘0‘ && input.charAt(point) <= ‘9‘)){
 48                 token.append(input.charAt(point));
 49                 point++;
 50             }
 51 //            point--;//后退一个位置
 52             for(int i = 0; i < keyWords.length; i++){
 53                 if(keyWords[i].equals(String.valueOf(token))){
 54                     syn = i + 1;//修改种别码
 55                     break;
 56                 }
 57             }
 58         }//if
 59         else if(input.charAt(point) >= ‘0‘ && input.charAt(point) <= ‘9‘){//如果是数字
 60             syn = 4;
 61             sum = 0;
 62             while(input.charAt(point) >= ‘0‘ && input.charAt(point) <= ‘9‘){
 63                 sum = sum * 10 + (input.charAt(point) - ‘0‘);
 64                 point++;
 65             }
 66             //point--;//后退一个字符
 67         }//else if
 68         else{//其他字符
 69             switch(input.charAt(point)){
 70                 case ‘>‘://大于符号
 71                     token = new StringBuffer(">");//重置token
 72                     point++;
 73                     if(input.charAt(point) == ‘=‘){
 74                         token.append("=");
 75                         syn = 10;
 76                     }else{
 77                         syn = 9;
 78                         point--;
 79                     }
 80                     point++;
 81                     break;
 82                 case ‘<‘:
 83                     token = new StringBuffer("<");
 84                     point++;
 85                     if(input.charAt(point) == ‘=‘){
 86                         token.append("=");
 87                         syn = 12;
 88                     }else{
 89                         syn = 11;
 90                         point--;
 91                     }
 92                     point++;
 93                     break;
 94                 case ‘*‘:
 95                     token = new StringBuffer("*");
 96                     syn = 5;
 97                     point++;
 98                     break;
 99                 case ‘/‘:
100                     token = new StringBuffer("/");
101                     syn = 6;
102                     point++;
103                     break;
104                 case ‘+‘:
105                     token = new StringBuffer("+");
106                     syn = 7;
107                     point++;
108                     break;
109                 case ‘-‘:
110                     token = new StringBuffer("-");
111                     syn = 8;
112                     point++;
113                     break;
114                 case ‘;‘:
115                     token = new StringBuffer(";");
116                     syn = 14;
117                     point++;
118                     break;
119                 case ‘(‘:
120                     token = new StringBuffer("(");
121                     syn = 15;
122                     point++;
123                     break;
124                 case ‘)‘:
125                     token = new StringBuffer(")");
126                     syn = 16;
127                     point++;
128                     break;
129                 case ‘#‘:
130                     token = new StringBuffer("#");
131                     syn = 17;
132                     point++;
133                     break;
134                 case ‘=‘:
135                     token = new StringBuffer("=");
136                     syn = 13;
137                     point++;
138                     break;
139             }
140
141         }
142     }
143 }

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

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

时间: 2024-11-13 04:37:14

java 词法分析器的相关文章

Java语言词法分析器

一.实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字.标识符.常数.运算符.分隔符五大类.并依次输出各个单词的内部编码及单词符号自身值.(遇到错误时可显示“Error”,然后跳过错误部分继续显示). 二.实验准备工作 1.词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号.词法分析器的单词符号

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

这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有打开文件.保存文件.打开帮助文档.文本域内容的剪切和复制和黏贴.进行词法分析 程序的项目结构如图,Word类和Unidentifiable类是两个JavaBean类,存放的参数有两个row(整型).word(String),row用于获取行数,word用于获取标识符,LexerFrame是词法分析器的界面类,Analyze封装了进

java实现的简单词法分析器

一个简单的词法分析器 词法分析(Lexical Analysis) 是编译的第一阶段.词法分析器的主要任务是读入源程序的输入字符.将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素.这个词法单元序列被输出到语法分析器进行语法分析. 有关原理的介绍参考http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html 这里就不多说了. 下面直接代码,相关注释在代码中均已经给出,对字符串的处理完全按照自己的思路编写的.

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

Lucene:基于Java的全文检索引擎简介 (zhuan)

http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的

2015网易校招Java开发工程师(技术架构)在线笔试题

1.  程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process)是最初定义在Unix等多用户.多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念.以Unix操作系统 为例,进程是Unix操作系统环境中的基本成分.是系统资源分配的基本单位.Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统 对应用程序进程的控制来实现的. 

我的第一个编译器之词法分析器

用Java写java的编译器和jvm 为什么用java,java的结构最便于理解,其丰富的设计模式能使编译器的结构十分鲜明 一个编译器的前端模型 源代码–词法分析器-(词法单元)-语法分析器-(语法分析树)-中间代码生成器–三地址代码 再加上一个符号表连接所有的结构 文法定义 一个上下文无关方法由四个元素组成 1.一个终结符号集合,也就是"词法单元"终结符号是该文法定义的语言的基本符号的集合 2.一个非终结符号集合,"语法变量"每个非终结符号表示一个终结符号串的集合

Lucene:基于Java的全文检索引擎简介

Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 另外,如果是在选择全文引擎,现在也许是试试 Sphinx的时候了:相比Lucene速度更快, 有中文分词的

1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA代码,实现一个支持常用功能的正则表达式引擎.它支持贪婪匹配和懒惰匹配:支持零宽度字符(如"\b", "\B"):支持常用字符集(如"\d", "\s"等):支持自定义字符集("[a-f]","[^b-