编译器-下面java代码存在哪些问题?

问题描述

下面java代码存在哪些问题?

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class compiler {
static String keyword[]={"main","FILE","int","char","if","else","return","printf","scanf","void","for","while","do","continue","break","include"};
public static boolean isDigit(char ch){
if(ch>='0'||ch<='9')
return true;
else
return false;
}
public static boolean isAlpha(char ch) {
if(ch>='a'&&ch<='z'||ch>='A'&& ch<='Z')
return true;
return false;
}
public static boolean isKey(String word) {
int i= 0;
for(i=0;i<keyword.length;i++){
if(keyword[i].equals(word))
return true;
}
return false;
}
//public static boolean isBc(char ch) {
// if(ch==' ')
// return true;
// return false;
}
public static void main(String[] args) {
try {
//System.out.println("--------------");
File file = new File("F:test.txt");
FileInputStream fis = new FileInputStream(file);
//System.out.println("--------------");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String word;
while ((word=br.readLine())!=null) {
System.out.println("--------"+word);
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<word.length();i++){
char token;
if(Character.isLetter(word.charAt(i))){
token=word.charAt(i);
// System.out.println("********"+token);
stringBuilder.append(token);
if(i+1<word.length()&&!Character.isLetter(word.charAt(i+1))) {
if(isKey(stringBuilder.toString())){
System.out.println("关键字:"+stringBuilder);
}
else {
System.out.println("普通标识符:"+stringBuilder);
}
stringBuilder.setLength(0);
}

}
else if ( isDigit(word.charAt(i))) {
token=word.charAt(i);
// System.out.println("********"+token);
stringBuilder.append(token);
if(i+1<word.length()&&!isDigit(word.charAt(i+1))){
System.out.println("无符号实数"+stringBuilder);
stringBuilder.setLength(0);
}
}
else{
token=word.charAt(i);
// System.out.println("********"+token);
switch (token) {
case '[':
case ']':
case '{':
case '}':
case ',':
case ':':
case ';':
case '(':
case ')':System.out.println("分界符:"+token);
break;
case'=':System.out.println("运算符:"+token);
break;
default:System.out.println("无法识别字符:"+token);
break;
}
}
}

}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
我想实现一个简单的编译器 后面情况还没写完 但是试了一下 总是有问题 根本不能到数字和符号判断那里去 不知道哪里有错 新手求指导

解决方案

自己调试下,看看为什么没有进入

解决方案二:

//public static boolean isBc(char ch) {
// if(ch==' ')
// return true;
// return false;
}
最后一个"}"没有注释掉

解决方案三:

看到第一个if语句的判断貌似就有问题……楼主想判断出26个字母不论大小写,或的后面至少得加个括号吧…两个and号也得加括号吧…否则就被短路了……下面还没看…跟一楼一样…建议debug调试下…一步步看值是不是你想要的…

解决方案四:

你先说一下你的代码要实现什么功能啊

解决方案五:

你先说一下你的代码要实现什么功能啊

解决方案六:

晚上下班又看了一遍,发现你想法是好的,我把代码粘过来跑了一遍,除了多了一个花括号,不知道是不是你粘错了。
跑完之后,对这段代码有点理解了,这里提点建议:1,关键字可以存在Map里面,键为关键字,值为布尔值,判断的时候,getkey就可以了,返回不是空,表示是标识符。
2,读取硬盘文件时,你的盘符后面的分割符也写对,要注意读取的文件在硬盘中的编码格式,否则可能乱码,影响编译。
3、还有不是一行就代表一个句柄。java中用分号和花括号。
4、另外对于斜杠反斜杠引号的处理也要注意。
5、顺便问一句这个编译器也是要接受中文编译么?貌似中文也可以跑啊。
6、读取文件的后缀名要不要加以限制?
好吧我也是初学者,就只有想到这些了,希望对楼主有帮助。

时间: 2024-10-27 07:24:09

编译器-下面java代码存在哪些问题?的相关文章

诊断Java代码: 轻松掌握Java泛型

J2SE 1.5 - 代号为 Tiger - 计划在 2003 年年底发布.我一直都热衷于尽可能多地收集有关即将推出的新技术的预告信息,因此我将撰写一系列的文章,讨论可从 V1.5 中获得的新的和经过重组的特性,本文是第一篇.我特别想谈谈泛型类型并重点讲述在 Tiger 中为了支持它们而进行的更改和调整. 在许多方面,Tiger 肯定是迄今为止在 Java 编程方面(包括对源语言语法的重大扩展)所取得的最大进步.Tiger 中计划进行的最显著的变化是添加泛型类型,正如在 JSR-14 原型编译器

诊断Java代码: 在规范钢丝上行走

要构建可靠的软件,程序规范很关键.没有良好定义的规范,很难诊断软件系统的异常行为.但是很多软件系统的程序规范定义得很差劲.而且更糟的,是许多软件系统根本就没有规范. 直观的看,程序规范是对程序行为的一种描述.它可以采取许多形式,但无论采取何种形式,都有一条主线贯穿所有实例:必须有某种类型的系统规范,因为您得依靠它来判断系统是否运转正常. 规范可以形式化也可以松散地定义,这取决于开发中系统的稳定性和危险程度,还与开发完毕后修改系统的容易程度有关. 我们将通过讨论规范为什么重要.为什么会经常被忽略以

提高 Java 代码的性能

性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换 很多算法用尾递归方法表示会显得格外简明.编译器会自动把这种方法转换成循环,以提高程序的性能.但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换.这就意味着在 Java 语言中采用尾递归表示可能导致巨大的内存占用,而这并不是我们期望的结果.Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会.他说明了为什么这是一个重要问题,并

JAVA代码编写的30条建议

JAVA代码编写的30条建议 (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数. Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此.对于域名扩展名称

使用非Java代码

JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余.但在某些情况下,还是必须使用非JAVA编码.例如,我们有时要访问操作系统的专用特性,与特殊的硬件设备打交道,重复使用现有的非Java接口,或者要使用"对时间敏感"的代码段,等等.与非Java代码的沟通要求获得编译器和"虚拟机"的专门支持,并需附加的工具将Java代码映射成非Java代码(也有一个简单方法:在第15章的"一个Web应用"小节中,有个例子解释了如何利用标准输入

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告

概述 BEAM 报告的结果文件是通过 build.xml 中 --beam::complaint_file 所定义的,在这 里,本文假设其为 BEAM-messages.BEAM-messages 记录着报出的所有代码缺陷,这些缺陷 分为 ERROR,MISTAKE 和 WARNING 三大类,严重程度依次递减.每一个具体的 ERROR, MISTAKE 和 WARNING 都代表着一个错误模式,本文接下来就通过实例分析理解其中的某些 重要错误模式,告诉读者在写 Java 代码时如何避免这些错误

诊断Java代码: 消除包间的耦合关联

测试优先编程(test-first programming)中反复遇到的一个问题是,似乎不可能对程序的许多部分进行自动测试.尤其当程序在很大程度上要利用外部资源和库时,似乎很难对它进行测试,因为没有很好的方法来模拟程序与这些外部资源的连接. 然而,虽然只使用 Java 代码很难测试这样的程序,但有一种类型的编程(带有开发工具)可以解决这个问题 ― 基于组件的编程. 基于组件的编程和 Java 语言 我所说的基于组件的编程是指什么?我只是指,编程时程序的各个单元处于分布状态,而不是象 JavaBe

在linux里面写java代码遇到的一些问题

问题描述 在linux里面写java代码遇到的一些问题 既然linux是不需要后缀名字,那边一java程序的时候为什么源文件的名字非要加后缀 .java呢,还有就是vim好像没有标注关键字,这个是不是能调出来 解决方案 Linux系统的后缀名确实不重要,但是这是对于Linux操作系统而言的而不是对于装在Linux上的应用程序,很多应用程序就靠后缀名来识别一个文件是不是自己需要的,比如说编译器 解决方案二: 因为JAVA虚拟机需要后缀 解决方案三: 没有后缀,,他怎么知道是什么语言程序的 解决方案

诊断 Java 代码: 提高 Java 代码的性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换

简介: 很多算法用尾递归方法表示会显得格外简明.编译器会自动把这种方法转换成循环,以提高程序的性能.但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换.这就意味着在 Java 语言中采用尾递归方法将导致巨大的内存占用,而这并不是我们期望的结果.Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会.他说明了为什么这是一个重要问题,并提供了一段代码来帮助判断您的即时(JIT)编译器是否会在保持语言语义的