还是个新手,所以还没有可用分可以给。抱歉了,以后有了再多给吧  谢谢大家了
最近在用java为一个C语言的子集语言写一个编译器,目前在写词法分析部分。碰到处理多行注释时,卡住了。特来求教~
  该语言的注释方式为/*...*/支持多行注释,注释不允许嵌套。假如在该语言写的源程序中有如下代码段:
  /*这是注释
    这是注释
    这是注释
    这是注释
  */
 要求当词法分析的程序扫描到这一段后能识别这是这一段注释,并原封不动地输出到控制台窗口或者文件中。
由于注释是跨行的,
而在我的写的词法分析程序中,每次都用readLine()从控制台中读取一行,再使用 toCharArray()转化成字符数组来识别一个个单词。所以不知道该如何处理这些多行的注释。请大家指点了~~
以下是我还未完成的词法分析代码:
import java.io.*; void fromCosole() {
System.out.println("please input your source code:");
char[] array = getNewLine();//取得新的一行,返回一个有行中字符组成的字符数组  (如果是文件输入,这里该如何判断是否到文//件尾?)
int length = array.length;
int i = consum(array);// 跳过行开始的空白符:空格,制表符,回车换行
StringBuffer sb = new StringBuffer();
while (i <= length) {
if (array[i] >= 'a' && array[i] <= 'z') {// 判断是否为标识符或关键字 do {
if (i < length) {
sb.append(array[i]);
i++;
}
} while ((array[i] >= '0' && array[i] <= '9')
|| (array[i] >= 'a' && array[i] <= 'z')
|| array[i] == '_');
if (array[length] != '_') {
// 判断是否以下划线结尾
sb.append(array[length]);
if (this.isKeyWord(sb.toString().toCharArray())) {
System.out.println("reserved word:" + sb.toString());
} else {
System.out.println("ID,name=" + sb.toString());
}
} else {// 如果以下划线结束则报错
System.out.println("cannot use \"_\"as the end of a token");
} } else if (array[i] >= '0' && array[i] <= '9') {// 判断是否数字
do {
if (i < length) {
sb.append(array[i]);
i++;
}
} while ((array[i] >= '0' && array[i] <= '9'));
System.out.println("num,value=" + sb.toString());
} else if (array[i] == '=') {// 是否等号或者赋值符合
if (array[++i] == '=') {
System.out.println("==");
} else {
System.out.println("=");
i++;
}
} else if (array[i] == '<') {//判断是否大于号或者不等号
if (array[i + 1] == '>') {
System.out.println("<>");
}
System.out.println(array[i++]);
} else if(array[i]=='/'){           //这一段用于识别注释,但是不知道怎么处理好
if(array[i+1]=='*'){
i +=2;
char a = array[i];
while(a!='*'){
sb.append(a);
i++;
}
}

}else {
System.out.println(array[i]);
}
} }

解决方案 »

  1.   

    这个程序我用c++做过,你的整体思路是对的,在处理多行注释的时候,你就会涉及到和一行注释相混淆的问题
    首先,你要一行一行的读取,然后转换为字符串,如果是/*,你就开始把后面的字符读出,并且设置一个flag标签表明后面
    是注释的内容,直到读到*/时就停止读注释,并且改变flag表明注释完成。
    这样的话,无论是多行还是一行都是一样的,不需要考虑是一行还是多行,,,明不明白就就靠你自己了~~~~