问题描述
- 下面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、读取文件的后缀名要不要加以限制?
好吧我也是初学者,就只有想到这些了,希望对楼主有帮助。