⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan.java~43~

📁 我用java写的词法分析器
💻 JAVA~43~
字号:
package 编译技术;

/**字符串打描的思想如下
 * 首先获取要编译的源程序字符串,并将其中的每一个字符存储在一个字符数组里面
 *
 */

public class Scan
{
  //static int wordStart = 0; //标识一个单元的开始
  //static int wordEnd = 0; //标识一个单元的结束
  static int columns = 1; //记录当前列
  static int rows = 1; //记录当前行
  static int index = 0;
  static boolean wordState = true; //标识当前单元是否为非法字符单元,如果是,则wordState为false
  static String sourceString;
  static char[] c;
  static String s="";//要返回的子字符串
  public static String getWord(String sourceString)
  {
    //扫描字符串并返回每一个独立的单元
    c = new char[sourceString.length()];
    c = sourceString.toCharArray();
    while (index < c.length)
    {
      //当前单元的首字符为字母
      if (isLetter(c[index]))
      {
        s=""+c[index];
        //wordStart = index;
        //wordEnd = index;
        //向后移一个字符
        index = index + 1;
        //wordEnd = wordEnd + 1;

        while (isLetter(c[index]) || isDigit(c[index]))
        {
          index++;
          concat(s, c[index]);
          //++wordEnd;
        }
        //返回以字母开头的字符串
        //return sourceString.substring(wordStart, wordEnd + 1);

        //doFirstLetter();
      }
    }
    //当前单元的首字符为数字

    /* else if (isDigit(c[index]))
     {
       wordStart = index;
       wordEnd = index;
       //doFirstDigit();
     }
     //当前单元的首字符为非字母非数字处理
     else
     {
       wordStart=index;
       wordEnd=index;
       //doUnLetterDigit();
     }
         }*/
    //return " ";
    return s;//sourceString.substring(wordStart, wordEnd + 1);
  }

  //第一个是字母的处理方法
  //如果下一个字符为数字或字母,则继续向后移
  //直到非数字非字母为止,再判断当前单元
  //是不是保留字,如果不是,则为正确的标识
  //符
  /*public static void doFirstLetter()
     {
    while(isLetter(c[index]) || isDigit(c[index]))
    {
      index=index+1;
      wordEnd=wordEnd+1;
    }
    String word=sourceString.substring(wordStart,wordEnd+1);
    int type = new ReservedWordTable().getKeyWordType(word);
   Frame1.MessageBox.setText(Frame1.MessageBox.getText()+"\n["+type+","+word+"]");
     }*/
  //第一个是数字的处理方法
  //判断下一个字符是不是数字或字母
  //如果是字母,则标识wordState为false
  //即此单元为非法标识符,但是要继续后面移
  //直到有非数字非字母为止
  /*public static void doFirstDigit()
     {
    while (isLetter(c[index]) || isDigit(c[index]))
    {
      if (isLetter(c[index]))
      {
        wordState = false;
      }
      index = index + 1;
      wordEnd = wordEnd + 1;
    }
    String word = sourceString.substring(wordStart, wordEnd+1);
    //int type = new ReservedWordTable().getKeyWordType(word);
    if (wordState == false)
    {
      Frame1.MessageBox.setText(Frame1.MessageBox.getText() + "\nERROR in " +
                                rows + "," + columns + " " + word);
    }
    else
    {
   Frame1.MessageBox.setText(Frame1.MessageBox.getText()+"\n[11,"+word+"]");
    }
     }
     //第一个是非字母非数字的处理方法
     //判断是不是运算符或关系符
     //首先判断是不是>,如果是,则判断下一个字符是不是=
     //如果是,则当前单元为>=,开始下一单元,如果不是
     //则当前单元为>,开始下一单元的处理
     //其它类同
     public static void doUnLetterDigit()
     {

     }*/
  //判断是不是字母
  public static boolean isLetter(char ch)
  {
    return java.lang.Character.isLetter(ch);
  }

  //判断是不是数字
  public static boolean isDigit(char ch)
  {
    return java.lang.Character.isDigit(ch);
  }

  public char getBc(char[] sentenceChar)
  {
    try
    {
      while ( (sentenceChar[this.index]) == ' ')
      {
        this.index++;
      }
      this.index++;
    }
    catch (java.lang.ArrayIndexOutOfBoundsException e)
    {
      return ';'; //表示此行已经结束
    }
    return sentenceChar[index - 1];
  }

  public char getChar(char[] sentenceChar)
  {
    //next();
    this.index++;
    return sentenceChar[this.index - 1];
  }

  public static  String concat(String token, char chr)
  {
    String tmpS = token + String.valueOf(chr);
    token = tmpS;
    return token;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -