basic编译器代码

    技术2022-05-19  26

    /** * * * * * * * * **/

    //package JBasicShell;

    import java.io.*;

    // {{{ class JBasicShell

    /** * * * * * * * **/

    public class JBasicShell{ // {{{ main function  /**   *   *   *   **/ public static void main(String[] args) {  if (args.length == 0) {   JBasicShell.runInteractive();   } else if (args.length == 1) {   if (args[0].equals("-h")) {    JBasicShell.help();   } else if (args[0].equals("-v")) {    JBasicShell.version();   } else if (args[0].equals("-i")) {    JBasicShell.runInteractive();   } else {    JBasicShell.help();   }  } else if (args.length == 2) {   if (args[0].equals("-r")) {    JBasicShell.run(args[1]);   } else if (args[0].equals("-d")) {    JBasicShell.runDebug(args[1]);   } else {    JBasicShell.help();   }  } else {   JBasicShell.help();  } }

     // }}}  // {{{ static void runInteractive()

     /**   *   *   *   **/ private static void runInteractive() {   }  // }}}  // {{{ static void run($source)  /**   *   *   *   *   **/ private static void run(String sourcefile) {  String source = JBasicShell.loadSourcefile(sourcefile);  JBasicCore jbsh = new JBasicCore();  jbsh.run(source, false); }

     // }}}  // {{{ static runDebug(String sourcefle)  /**    *    *    *    *    **/ private static void runDebug(String sourcefile) {  String source = JBasicShell.loadSourcefile(sourcefile);                JBasicCore jbsh = new JBasicCore();                jbsh.run(source, true); }

     // }}}

     // {{{ static loadSourcefile(String sourcefile)  /**  *  *  *  *  **/ private static String loadSourcefile(String sourcefile) {  StringBuffer buffer = new StringBuffer();  FileReader fr = null;

      try {   fr = new FileReader(sourcefile);   int i;   while ((i = fr.read()) != -1) {    buffer.append((char)i);   }   fr.close();  } catch (FileNotFoundException e) {   System.out.println("This file isn't found.");  } catch (IOException e) {   System.out.println("It is exit since some execptions");  }     return new String(buffer); }

     // }}}  // {{{ static void help()  /**   *   *   *   **/ private static void help() {  System.out.println("ok"); }  // }}}  // {{{ static void version()  /**   *   *   *   *   **/ private static void version() {   }

     // }}}}

    // }}}

    // {{{ class JBasicCore

    /** * This is the main class in the 'JBasicShell', and is used in parsing  * the code string of the Basic program.It be contain some constants * , variables and sub-classes for describing the struct of the Basic  * code, and some methods for parsing and debugging the program code. * * @package   JBasicShell * @category  Language * @version   1.0.0 * **/

    class JBasicCore{// {{{ sub-classes  // {{{ class label  /**   *    *   * @access  private   **/  private class label {                public String name = "";                public int pos     = 0;        }  // }}}  // {{{ class command  /**   *    *   *   * @access  private   **/ private class command {                public String name = "";                public int cmdNo   = 0;

                    public command(String name, int cmdNo) {                        this.name  = name;                        this.cmdNo = cmdNo;                }        }  // {{{ class for_stack

     /**   *   *   *   *   * @access  private   **/ private class for_stack {                int var    = 0;                int pos    = 0;                int target = 0;        } // }}}   // }}}  // {{{ constant

     /**   *   *    * @access  private   **/  private static int NUM_LAB         = 100;

     /**   * the keyword number in Basic language   *   * @var     int   * @static   * @access  private   **/        private static int COMMAND_NUM     = 13;

     /**   *    *   * @access  private   **/        private static int FOR_NEXT        = 25;

     /**  *  *  * @access  private **/        private static int SUB_NEXT        = 25;

     /**   *   *   * @access  private   **/        private static int LETTER_NUM      = 26;

     /**   * the command sign for running the keywork 'PRINT'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_PRINT    = 1;

     /**   * the command sign for running the keywork 'INPUT'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_INPUT    = 2;

     /**   * the command sign for running the keywork 'IF'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_IF       = 3;

     /**   * the command sign for running the keywork 'THEN'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_THEN     = 4;

     /**   * the command sign for running the keywork 'FOR'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_FOR      = 5;

     /**   * the command sign for running the keyword 'NEXT'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_NEXT     = 6;

     /**   * the command sign for running the keyword 'TO'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_TO       = 7;

     /**   * the command sign for running the keyword 'GOTO'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_GOTO     = 8;

     /**   * the command sign for running when see 'EOL' sign   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_EOL      = 9;

     /**    * the command sign for running when finish parsing    *    * @var     int    * @static    * @access  private    **/        private static int ACTION_FINISHED = 10;

     /**   * the command sign for running the keyword 'gosub'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_GOSUB    = 11;

     /**   * the command sign for running the keyword 'return'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_RETURN   = 12;

     /**   * the command sign for running the keyword 'end'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_END      = 13;

     /**   * the command sign for running the keyword 'system'   *   * @var     int   * @static   * @access  private   **/        private static int ACTION_SYSTEM   = 14;  /**   * the parsing-item type for 'delimiter'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_DELIMITER = 1;

     /**   * the parsing-item type for 'variable'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_VARIABLE  = 2;

     /**   * the parsing-item type for 'number'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_NUMBER    = 3;

     /**   * the parsing-item type for 'command'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_COMMAND   = 4;

     /**   * the parsing-item type for 'string'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_STRING    = 5;

     /**   * the parsing-item type for 'quote'   *   * @var     int   * @static   * @access  private   **/ private static int WORDTYPE_QUOTE     = 6;

     // }}}  // {{{ variables  /**   *   *   * @access  private   **/ private label[] label_table     = new label[this.NUM_LAB];

     /**   *   *   * @access  private   **/        private command[] command_table = new command[this.COMMAND_NUM];

     /**   *   *   * @access  private   **/        private for_stack[] fstack      = new for_stack[this.FOR_NEXT];

     /**   *   *   * @access  private   **/ private int[] gstack            = new int[this.SUB_NEXT];

     /**   *   *   * @access  private   **/        private int[] variables         = new int[this.LETTER_NUM];

     /**   *    *   * @access  private   **/        private String proc_contents = "";

     /**   *   *    * @access  private   **/        private int    proc_position = 0;

     /**   *   *   * @access  private   **/        private int    proc_wordtype = 0;

     /**   *   *   * @access  private   **/        private int    proc_action   = 0;

     /**   *   *   * @access  private   **/        private String strBuffer_new = "";

     /**   *   *   * @access  private   **/        private String strBuffer_old = "";

     /**   *   *   * @access  private   **/        private int ftop = 0;

     /**   *   *   * @access private   **/        private int gtop = 0;

     /**   *   *   * @access  private   **/ private boolean debug = false;

     // }}}  // {{{ constructor  /**   *   *   *   *   **/ public JBasicCore() {                this.initCommand();        } // }}}  // {{{ void initCommand()  /**   * initalize the command keyword string   *   * @access  private   **/ private void initCommand() {                this.command_table[0]  = new command("print",  this.ACTION_PRINT);                this.command_table[1]  = new command("input",  this.ACTION_INPUT);                this.command_table[2]  = new command("if",     this.ACTION_IF);                this.command_table[3]  = new command("then",   this.ACTION_THEN);                this.command_table[4]  = new command("goto",   this.ACTION_GOTO);                this.command_table[5]  = new command("for",    this.ACTION_FOR);                this.command_table[6]  = new command("next",   this.ACTION_NEXT);                this.command_table[7]  = new command("to",     this.ACTION_TO);                this.command_table[8]  = new command("gosub",  this.ACTION_GOSUB);                this.command_table[9]  = new command("return", this.ACTION_RETURN);                this.command_table[10] = new command("end",    this.ACTION_END);                this.command_table[11] = new command("system", this.ACTION_SYSTEM);                this.command_table[12] = new command("",       this.ACTION_END);        }

     // }}}  // {{{ void run(String source)  /**   * run the language parsing for Basic code, and support the debug mode and   * immediate-running mode.   *    * @param   string   the source string of the Basic language   *    * @param   boolean  it is in the debug mode if true,    *    else it is immediate-running mode   *   * @access  public   **/ public void run(String source, boolean debug) {                this.proc_contents = source;  this.debug = debug;

      this.scanLabel();                do {                        this.checkCurrChar();                        if (this.proc_wordtype == this.WORDTYPE_VARIABLE) {    this.putBack();     this.assignment();                        } else {                                if (this.proc_action == this.ACTION_PRINT) {                                        this.execPrint();                                } else if (this.proc_action == this.ACTION_GOTO) {                                        this.execGoto();                                } else if (this.proc_action == this.ACTION_IF) {                                        this.execIf();                                } else if (this.proc_action == this.ACTION_FOR) {                                        this.execFor();                                } else if (this.proc_action == this.ACTION_NEXT) {                                        this.execNext();                                } else if (this.proc_action == this.ACTION_INPUT) {                                        this.execInput();                                } else if (this.proc_action == this.ACTION_GOSUB) {                                        this.execGosub();                                } else if (this.proc_action == this.ACTION_RETURN) {                                        this.execReturn();                                } else if (this.proc_action == this.ACTION_SYSTEM) {                                        this.execSystem();                                } else if (this.proc_action == this.ACTION_END) {                                        this.execEnd();                                } else {}                        }                } while(this.proc_action != this.ACTION_FINISHED);        }

     // }}}  // {{{ void scanLabel()  /**   *   *   *   *   *   **/ private void scanLabel() {                int tmp = this.proc_position;

                    this.checkCurrChar();                if (this.proc_wordtype == this.WORDTYPE_NUMBER) {                        label_table[0].name = this.strBuffer_new;                        label_table[0].pos  = this.proc_position;                }                this.findEOL();

                    do {                        this.checkCurrChar();                        if (this.proc_wordtype == this.WORDTYPE_NUMBER) {                                int addr = this.getNextLabel(this.strBuffer_new);                                if (addr == -1) {                                        this.showError(5);                                } else if (addr == -2) {                                        this.showError(6);                                } else {                                }                        }                        if (this.proc_action != this.ACTION_EOL) {                                this.findEOL();                        }                } while(this.proc_action != this.ACTION_FINISHED);

                    this.proc_position = tmp;        }

     // }}}  // {{{ void findEOL()  /**   *   *   *   *   **/ private void findEOL() {                char curr_char = 0;                int len = this.proc_contents.length();

      while (curr_char != '/r' && curr_char != '/n' && this.proc_position < len) {   curr_char = this.proc_contents.charAt(this.proc_position);   this.proc_position++;  }

                    if (this.proc_position < len) {                        this.proc_position++;                }        }

     // }}}  // {{{ int getNextLabel(String str)  /**   *   *   *   *   **/ private int getNextLabel(String str) {                for (int t = 0; t < NUM_LAB; t++) {                        String name = this.label_table[t].name;                        if (name.equals("")) {                                return t;                        }                        if (name.equals(str)) {                                return -2;                        }                }

                    return -1;        }

     // }}}  // {{{ int findLabel(String str)  /**   *   *   *   *   **/ private int findLabel(String str) {                for (int t = 0; t < this.NUM_LAB; t++) {                        if (str.equals(this.label_table[t].name)) {                                return this.label_table[t].pos;                        }                }

                    return -1;        }

     // }}}  // {{{ void execPrint()  /**   *   *   *   *   **/ private void execPrint() {                int answer = 0;                int len    = 0;                int space  = 0;                char last  = 0;

                    do {                        this.checkCurrChar();

                            if (this.proc_action == this.ACTION_EOL ||                            this.proc_action == this.ACTION_FINISHED) {                                break;                        }

                            if (this.proc_wordtype == this.WORDTYPE_QUOTE) {                                System.out.print(this.strBuffer_new);                                len += this.strBuffer_new.length();                                this.checkCurrChar();                        } else {                                this.putBack();                                answer = this.getExp(answer);                                System.out.print(answer);                                len += answer;                                this.checkCurrChar();                        }      last = this.strBuffer_new.charAt(0); //                        if (last == ';') {                                space = 8 - (len % 8);                                len += space;

                                    while (space != 0) {                                        System.out.print(" ");                                        space--;                                }                        } else if (last == ',') {                        } else if (this.proc_action == this.ACTION_EOL ||                                   this.proc_action == this.ACTION_FINISHED) {                                this.showError(0);                        }                } while(last == ';' || last == ',');

                    if (this.proc_action == this.ACTION_EOL ||                    this.proc_action == this.ACTION_FINISHED) {                        if (last != ';' && last != ',') {                                System.out.print("/n");                        }                } else {                        this.showError(0);                }        }

     // }}}  // {{{ void execGoto()  /**   *   *   *   *   **/

     private void execGoto() {                this.checkCurrChar();                int pos = this.findLabel(this.strBuffer_new);                if (pos < 0) {                        this.showError(7);                } else {                        this.proc_position = pos;                }        }  // }}}  // {{{ void execIf()  /**  *  *  *  *  *  **/ private void execIf() {                int x = 0;                x = this.getExp(x);                //this.checkExp();                char tmp = this.strBuffer_new.charAt(0); //

                    if ("=<>".indexOf(tmp) >= 0) {                        this.showError(0);                        return;                }                char op = tmp;

                    int y = 0;                y = this.getExp(y);

                    boolean cond = false;                switch (op) {                        case '<':                                if (x < y) {                                        cond = true;                                }                                break;                        case '>':                                if (x > y) {                                        cond = true;                                }                                break;                        case '=':                                if (x == y) {                                        cond = true;                                }                                break;                }

      if (cond) {                        this.checkCurrChar();                        if (this.proc_action != this.ACTION_THEN) {                                this.showError(8);                                return;                        }                } else {                        this.findEOL();                }        }

     // }}}  // {{{ void execFor()  /**   *   *   *   *   *   **/ private void execFor() {                for_stack i = new for_stack();                int value   = 0;

                    this.checkCurrChar();                if (!Character.isLetter(this.strBuffer_new.charAt(0))) {                        this.showError(4);                        return;                }

                    char ch = this.strBuffer_new.toUpperCase().charAt(0);                i.var = Integer.valueOf(ch - 'A');

                    this.checkCurrChar();                char op = this.strBuffer_new.charAt(0);                if (op != '=') {                        this.showError(3);                        return;                }

                    value = this.getExp(value);                this.variables[i.var] = value;

                    this.checkCurrChar();                if (this.proc_action != this.ACTION_TO) {                        this.showError(9);                }                i.target = this.getExp(i.target);

                    if (value >= this.variables[i.var]) {                        i.pos = this.proc_position;                        this.fpush(i);                } else {                        while (this.proc_action != this.ACTION_NEXT) {                                this.checkCurrChar();                        }                }        }

     // }}}  // {{{ void execNext()  /**   *   *   *   *   *   *   **/ private void execNext() {                for_stack i = new for_stack();                i = this.fpop();                this.variables[i.var]++;

                    if (this.variables[i.var] > i.target) {                        return;                }

                    this.fpush(i);                this.proc_position = i.pos;        }

     // }}}  // {{{ execGosub()  /**   *   *   *   *   *   **/ private void execGosub() {                this.checkCurrChar();                int loc = this.findLabel(this.strBuffer_new);

                    if (loc < 0) {                        this.showError(7);                } else {                        this.gpush(this.proc_position);                        this.proc_position = loc;                }        }

     // }}}  // {{{ void execInput()  /**   *   *   *   *   **/ private void execInput() {                this.checkCurrChar();                if (this.proc_wordtype == this.WORDTYPE_QUOTE) {                        System.out.print(this.strBuffer_new);                        this.checkCurrChar();                        char op = this.strBuffer_new.charAt(0);                        if (op != ',') {                                this.showError(1);                        }                        this.checkCurrChar();                } else {                        System.out.print("?");                }                char ch = this.strBuffer_new.toUpperCase().charAt(0);                int var = Integer.valueOf(ch - 'A');                int inp = 0;                //                 this.variables[var] = inp;        }

     // }}}  // {{{ void execReturn()  /**   *   *   *   **/ private void execReturn() {                this.proc_position = this.gpop();        }

     // }}}  // {{{ void execSystem()  /**   *   *   *   **/ private void execSystem() { }

     // {{{ void execEnd()  /**   *   *   *   *   **/ private void execEnd() {        }

     // }}}  // {{{ void gpush(int position)  /**   *   *   *   *   **/ private void gpush(int position) {                this.gtop++;                if (this.gtop == this.SUB_NEXT) {                        this.showError(12);                        return;                }                this.gstack[this.gtop] = position;        }

     // }}}  // {{{ int gpop()  /**   *   *   *   **/ private int gpop() {                if (this.gtop == 0) {                        this.showError(13);                        return 0;                }                int ret = this.gstack[this.gtop];                this.gtop--;                return ret;        }

     // }}}  // {{{ void fpush(for_stack i)

     /**   *   *   *   *   **/  private void fpush(for_stack i) {                if (this.ftop > this.FOR_NEXT) {                        this.showError(0);                }

                    this.fstack[ftop] = i;                this.ftop++;        }  // }}}  // {{{ for_stack fpop()  /**   *   *   *   *   **/ private for_stack fpop() {                this.ftop--;

                    if (ftop < 0) {                        this.showError(11);                }

                    return this.fstack[ftop];        }

     // }}}  // {{{ int getExp(number)  /**   *   *   *   *   *   **/ private int getExp(int number) {                int result = number;                this.checkCurrChar();

                    if (this.strBuffer_new.equals("")) {                        this.showError(2);                        return result;                }

                    result = this.levelII(result);                this.putBack();

                    return result;        }

     // }}}  // {{{ int levelII(int number)  /**   *   *   *   **/ private int levelII(int number) {                int result = this.levelIII(number);                int hold   = 0;                char op    = this.strBuffer_new.charAt(0);

                    while (op == '+' || op == '-') {                        this.checkCurrChar();                        hold   = this.levelIII(hold);                        result = this.arith(op, result, hold);                }

                    return result;        }

     // }}}  // {{{ int levelIII(int number)  /**   *   *   *   *   *   **/ private int levelIII(int number) {                int result = this.levelIV(number);                int hold   = 0;                char op    = this.strBuffer_new.charAt(0);

                    while (op == '*' || op == '/' || op == '%') {                        this.checkCurrChar();                        hold = this.levelIV(hold);                        result = this.arith(op, result, hold);                }

                    return result;        }

     // }}}  // {{{ int levelIV(int number)  /**   *   *   *   **/ private int levelIV(int number) {                int result = this.levelV(number);                int hold   = 0;                char op    = this.strBuffer_new.charAt(0);

                    if (op == '^') {                        this.checkCurrChar();                        hold = this.levelIV(hold);                        result = this.arith('^', result, hold);                }

                    return result;        }

     // }}}  // {{{ int levelV(int number)  /**   *   *   *   *   **/ private int levelV(int number) {                char op  = 0;                char tmp = this.strBuffer_new.charAt(0);

                    if ((this.proc_wordtype == this.WORDTYPE_DELIMITER) &&                    (tmp == '+' || tmp == '-')) {                        op = tmp;                        this.checkCurrChar();                }                int result = this.levelVI(number);                if (op == 0) {                        result = this.unary(op, result);                }

                    return result;        }

     // }}}  // {{{ int levelVI(int number)

     /**   *   *   *   **/  private int levelVI(int number) {                char op = this.strBuffer_new.charAt(0);                int result = 0;

                    if ((this.proc_wordtype == this.WORDTYPE_DELIMITER)                    && (op == '(')) {                        this.checkCurrChar();                        result = this.levelII(number);                        op = this.strBuffer_new.charAt(0);                        if (op != ')') {                                this.showError(1);                                return result;                        }                        this.checkCurrChar();                } else {                        result = this.primitive(number);                }

                    return result;        }

     // }}}  // {{{ int primitive(number)  /**   *   *   *   *   **/ private int primitive(int number) {                int result = number;

                    if (this.proc_wordtype == this.WORDTYPE_VARIABLE) {                        result = this.findVar(this.strBuffer_new.charAt(0));                        this.checkCurrChar();                } else if (this.proc_wordtype == this.WORDTYPE_NUMBER) {                        result = Integer.valueOf(this.strBuffer_new);                        this.checkCurrChar();                } else {                        this.showError(0);                }

                    return result;        }

     // }}}  // {{{ int unary(char op, int number)  /**   *   *   *   *   **/ private int unary(char op, int number) {                int result = number;

                    if (op == '-') {                        result = 0 - number;                }

                    return result;        }

     // }}}  // {{{ void putBack()  /**   *   *   *   *   **/ private void putBack() {                this.proc_position -= this.strBuffer_new.length();        }

     // }}}  // {{{ int arith(char op, int number_i, int number_ii)  /**   *   *   *   *   *   **/ private int arith(char op, int number_i, int number_ii) {                int result = 0;                switch (op) {                        case '-':                                result = number_i - number_ii;                                break;                        case '+':                                result = number_i + number_ii;                                break;                        case '*':                                result = number_i * number_ii;                                break;                        case '/':                                result = (int)(number_i / number_ii);                                break;                        case '%':                                result = number_i % number_ii;                                break;                        case '^':                                if (number_ii < 0) {                                        result = 0;                                } else if (number_ii == 0) {                                        result = 1;                                } else {                                        result = number_i;                                        for (int t = number_ii -1; t > 0; t--) {                                                result = number_i * result;                                        }                                }                                break;                }                return result;        }

     // }}}  // {{{ void checkCurrChar()  /**   * check the current char in the source string for getting the    * parsing item, such as command, variable and others   *    * @access  private   **/ private void checkCurrChar() {  /**    * check the last char in the source string to exit parsing    **/                if (this.proc_position >= (this.proc_contents.length() - 1)) {                        this.strBuffer_new = "";                        this.proc_action   = this.ACTION_FINISHED;                        this.proc_wordtype = this.WORDTYPE_DELIMITER;                        return;                }

      this.strBuffer_old = this.strBuffer_new;  char curr_char = this.proc_contents.charAt(this.proc_position);

      /**    * check the blank space to ignore it    **/                while (this.isWhite(curr_char)) {                        this.proc_position++;                }

      /**    * check that this char is a 'EOL' for Windows    **/                if (curr_char == '/r') {                        this.strBuffer_new = "/r/n";                        this.proc_action   = this.ACTION_EOL;                        this.proc_wordtype = this.WORDTYPE_DELIMITER;                        this.proc_position += 2;                        return;                }

      /**    * check that this char is a 'EOL' for UNIX/Linux    **/  if (curr_char == '/n') {   this.strBuffer_new = "/n";   this.proc_action   = this.ACTION_EOL;                        this.proc_wordtype = this.WORDTYPE_DELIMITER;                        this.proc_position++;                        return;  }

      /**    * check that this char is a arithmetic char    **/                if ("+-*^/%=;(),><".indexOf(curr_char) >= 0) {                        this.strBuffer_new = "" + curr_char;                        this.proc_wordtype = this.WORDTYPE_DELIMITER;                        this.proc_position++;                        return;                }

      /**    * check that this char is a quotes char    **/  if (curr_char == '"') {                        int index_start = this.proc_position + 1;                        do {                                this.proc_position++;                                curr_char = this.proc_contents.charAt(this.proc_position);                        } while (curr_char != '"' && curr_char != '/r' && curr_char != '/n');                        if (curr_char == '/r' || curr_char == '/n') {                                this.showError(1);                        }                        int index_end = this.proc_position;                        this.strBuffer_new = this.proc_contents.substring(index_start, index_end);                        this.proc_wordtype = this.WORDTYPE_QUOTE;                        this.proc_position++;                        return;                }

      /**    * check that this char is a digit char    **/                if (Character.isDigit(curr_char)) {                        int index_start = this.proc_position;                        while (!this.isDelim(curr_char)) {                                this.proc_position++;                                curr_char = this.proc_contents.charAt(this.proc_position);                        }                        int index_end = this.proc_position;                        this.strBuffer_new = this.proc_contents.substring(index_start, index_end);                        this.proc_wordtype = this.WORDTYPE_NUMBER;                        return;                }

      /**    * check that this char is a letter char    **/  if (Character.isLetter(curr_char)) {                        int index_start = this.proc_position;                        while (!this.isDelim(curr_char)) {    this.proc_position++;                                curr_char = this.proc_contents.charAt(this.proc_position);                        }                        int index_end = this.proc_position;                        this.strBuffer_new = this.proc_contents.substring(index_start, index_end);                        this.proc_wordtype = this.WORDTYPE_STRING;

       /**     * check this string is a command or variable     **/                        if (this.lookup(this.strBuffer_new) > 0) {                                this.proc_wordtype = this.WORDTYPE_COMMAND;                        } else {                                this.proc_wordtype = this.WORDTYPE_VARIABLE;                        }                        return;                }        }

     // }}}  // {{{ int lookup(String strBuffer)  /**   *   *   *   *   **/ private int lookup(String strBuffer) {                String str = strBuffer.toLowerCase();                for (int i = 0; i < this.COMMAND_NUM; i++) {                        if (str.equals(this.command_table[i].name)) {                                return this.command_table[i].cmdNo;                        }                }                return 0;        }

     // }}}  // {{{ boolean isWhite(char c)  /**   *   *   *   **/ private boolean isWhite(char c) {                if (c == ' ' || c == 0x9) {                        return true;                }                return false;        }

     // }}}  // {{{ boolean isDelim(char c)  /**   *   *   *   *   **/ private boolean isDelim(char c) {                if (c == 0x9 || c == '/r' || c == '/n' ||                    ";,+-<>/*%^=()".indexOf(c) >= 0) {                        return true;                }                return false;        }

     // }}}  // {{{ void showError(int type)  /**  *  *  *  **/ private void showError(int type) {        }

     // }}}

     // {{{ int findVar(String str)  /**   *   *   *   **/ private int findVar(char ch) {  if (!Character.isLetter(ch)) {   this.showError(4);   return 0;  }  return Integer.valueOf(Character.toUpperCase(ch) - 'A'); }

     // }}}

     // {{{  /**   *   *   *   * @access  private   **/ private void assignment() {  this.checkCurrChar();  if (!Character.isLetter(this.strBuffer_new.charAt(0))) {   this.showError(4);   return;  }  char ch = this.strBuffer_new.charAt(0);  int var = Integer.valueOf(Character.toUpperCase(ch) - 'A');  this.checkCurrChar();  if (this.strBuffer_new.charAt(0) != '=') {   this.showError(3);   return;  }  int value = 0;  value = this.getExp(value);  this.variables[var] = value; }

     // }}} // }}}}

    // }}}


    最新回复(0)