java写的词法分析器有问题 无法判断出字符类型

maxuechao1213 2011-11-02 04:26:12

import java.io.*;

public class CFfenxiqi{

public CFfenxiqi(){}

int MAX=15;

char ch =' ';

String[] key={"begin","end","if","then","else","while","write","read",

"do", "call","const","char","until","procedure","repeat"};

public int Iskey(String c){ //关键字判断

int i;

for(i=0;i<MAX;i++) {

if(key[i].equals(c))

return 1;

}

return 0;

}

public int IsLetter(char c) { //判断是否为字母

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;

else return 0;

}

public int IsDigit(char c){ //判断是否为数字

if(c>='0'&&c<='9') return 1;

else return 0;

}

public void analyse(RandomAccessFile fpin){

String arr="";

try{

while((fpin.getFilePointer()<fpin.length())) {

arr="";

ch=fpin.readChar();

if(ch==' '||ch=='\t'||ch=='\n'){}

else if(IsLetter(ch)==1){

while(IsLetter(ch)==1||IsDigit(ch)==1) {

if((ch<='Z')&&(ch>='A')) ch+=32;

arr=arr+ch;

ch=fpin.readChar();

}

long pos=fpin.getFilePointer()-1;

fpin.seek(pos);

if (Iskey(arr)==1){System.out.println(arr+"\t$关键字");}

else System.out.println(arr+"\t$普通标识符");

}

else if(IsDigit(ch)==1){

while(IsDigit(ch)==1||(ch=='.'&&IsDigit(fpin.readChar())==1)){

arr=arr+ch;

ch=(char)fpin.read();

}

long pos=fpin.getFilePointer()-1;

fpin.seek(pos);

System.out.println(arr+"\t$无符号实数");

}

else switch(ch){

case'+':

case'-' :

case'*' :

case'=' :

case'/' :System.out.println(ch+"\t$运算符");break;

case'(' :

case')' :

case'[' :

case']' :

case';' :

case'.' :

case',' :

case'{' :

case'}' :System.out.println(ch+"\t$界符");break;

case':' :{ch=fpin.readChar();

if(ch=='=') System.out.println(":="+"\t$运算符");

else {System.out.println("="+"\t$运算符");

long pos=fpin.getFilePointer()-1;

fpin.seek(pos);

}break;}

case'>' :{ch=fpin.readChar();

if(ch=='=') System.out.println(">="+"\t$运算符");

if(ch=='>') System.out.println(">>"+"\t$输入控制符");

else { System.out.println(">"+"\t$运算符");

long pos=fpin.getFilePointer()-1;

fpin.seek(pos);

}break;}

case'<' :{ch=(char)fpin.read();

if(ch=='=')System.out.println("<="+"\t$运算符");

else if(ch=='<')System.out.println("<<"+"\t$输出控制符");

else if(ch=='>') System.out.println("<>"+"\t$运算符");

else{System.out.println("<"+"\t$运算符");

long pos=fpin.getFilePointer()-1;

fpin.seek(pos);

}break;}

default : System.out.println(ch+"\t$无法识别字符");

}

}
}catch(IOException e){}

}

public static void main(String args[]){

CFfenxiqi cc=new CFfenxiqi();

RandomAccessFile fpin;

String s="";

System.out.println("请输入源文件名(包括路径和后缀名):");

for(;;){

BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));

try{

s=keyin.readLine();

}catch(IOException e){}

try{

fpin=new RandomAccessFile(s,"r");

System.out.println("\n********************分析如下*********************");

cc.analyse(fpin);

fpin.close();

}catch(IOException e){

System.out.println("文件路径错误!\n请输入源文件名(包括路径和后缀名):");

}

}

}

}
...全文
123 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
maxuechao1213 2011-11-04
  • 打赏
  • 举报
回复
帮帮忙啊,大神们,谢谢啊!!!!
maxuechao1213 2011-11-03
  • 打赏
  • 举报
回复
begin

x:=9

if x>0 then x:=x+1...111a;

while a:=0 do

b:2*x/3;

end;
ytu2006123 2011-11-02
  • 打赏
  • 举报
回复
看下取文件内容
1.根据状态转换图直接编程 编一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)识别单词的类别并记录类别编号和值,形成二元式输,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输错误的位置在源程序中的第几行。将错误信息输到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 单词的构词规则: 字母=[A-Z a-z] 数字=[0-9] 标识符=(字母|_)(字母|数字|_)* 数字=数字(数字)*( .数字+|) 2.S语言表达式和语句说明 1.算术表达式:+、-、*、/、% 2.关系运算符:>、>=、<、<=、==、!= 3.赋值运算符:=,+=、-=、*=、/=、%= 4.变量说明:类型标识符 变量名表; 5.类型标识符:int char float 6.If语句:if 表达式then 语句 [else 语句] 7.For语句:for(表达式1;表达式2;表达式3) 语句 8.While语句:while 表达式 do 语句 9.S语言程序:由函数构成,函数不能嵌套定义。
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
基于Java实现的简单的词法分析器和语法分析器 基于Java实现的简单的词法分析器和语法分析器是一个基础的编译器前端项目,旨在帮助开发者理解编译器的前端部分是如何工作的。以下是一个简化的项目介绍,描述了如何使用Java实现这两个分析器。 ### 项目介绍: **目标**:使用Java实现一个简单的词法分析器和语法分析器。 **主要任务**: 1. **词法分析器**: - 定义词法规则,包括关键字、标识符、常数、运算符和分隔符等。 - 使用Java的正则表达式或有限自动机理论实现词法分析器,能够将源代码转换为词法单元序列。 - 处理词法错误,如非法字符或格式错误的数字。 2. **语法分析器**: - 定义语法规则,构建上下文无关文法(CFG)。 - 使用Java的递归下降解析器或LL(1)解析器实现语法分析器,能够将词法单元序列转换为抽象语法树(AST)。 - 处理语法错误,如语法错误和类型错误。 **技术要求**: - 熟悉Java编程语言。 - 了解编译原理中的词法分析、语法分析概念。 - 熟悉有限自动机理论和抽象语法树。 **开发工具**: - Java编译器,如OpenJDK。 - 代码编辑器或IDE,如IntelliJ IDEA、Eclipse。 ### 适合人员: - 计算机科学或相关领域的学生:此项目能够帮助他们实践编译原理和Java编程知识。 - 软件开发者:特别是那些对编译器和解释器如何工作感兴趣的程序员。 - 语言处理领域的研究者:此项目可以作为自然语言处理和编译技术的一个研究起点。 ### 额外建议: - 从一个简单的语言子集开始,逐步增加支持的语法和语义特性。 - 使用单元测试来验证分析器的正确性。 - 编详细的文档,记录设计决策和实现细节,便于项目维护和他人理解。 通过实现这样一个编译器前端,学生可以深入理解编译器的工作原理,提高Java编程技能,并为进一步学习编译原理和编程语言理论打下基础。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是一个很好的实践机会。

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧