用Java编写扫描仪

时间:2014-12-09 10:50:29

标签: java java.util.scanner lexical-analysis

我正在尝试编写一个能够读取C文件(.cm)的扫描程序。扫描仪完成后,它将打印每个令牌以及令牌的行号。如果令牌是标识符,则打印标识符的词位或字符串值;或者如果令牌是数字,则打印该数字的值。我是否已将此代码编写为接近实现我的扫描仪?我在确定输入行是标识符还是int时遇到问题。我想这是我对代码基本结构的尝试。

  import java.io.File;<br>
  import java.util.Scanner;

  public class ReadFile {

      public static void main(String[] args) {

          try {
              Scanner input = new Scanner(System.in);
              System.out.print("FileName: ");
              File file = new File(input.next());

              input = new Scanner(file);

              count = 1;
              while (input.hasNext()) {
                   if (input.hasNextInt()){
                       input.nextInt()
                       System.out.println(count + ", " + input);
                       count ++}
                   else if (input.hasNext){
                       System.out.println(count + ", " + line);
                       String line = input.next();
                       count ++}
              }
              input.close();

         } catch (Exception ex) {
              ex.printStackTrace();
         }
     }       

  }

我在Haskell中编写了类似的东西,我更喜欢函数式语言方法,但是想用Java编写一下。

1 个答案:

答案 0 :(得分:0)

您可能想要考虑几件事。

首先,您假设每个令牌都出现在新行上。对于你正在做的事情,这可能是真实的;但使用input.next()而不是input.nextLine()会更灵活。这将读取下一个标记,而不关心它是否在新行上。

要读入下一个标记并确定它是否为整数,最简单的方法是查看input.hasNextInt()。这将告诉您,无需超过令牌,是否可以将下一个令牌解析为整数。如果是,您可以使用input.nextInt()阅读;如果没有,请使用String阅读input.next()