scanner.java

来自「桂林电子科技大学编译原理完整JAVA源代码(词法、语法、语义) 此为完整版本」· Java 代码 · 共 463 行 · 第 1/2 页

JAVA
463
字号
                    if(ch[a+1]=='-') {
                    s[n]="--";
                    a=a+1;
                    col++;
                    }
                lie[n]=col;
            }
        }
    }
    
    
    public  void check(String s) {
        err="No";name=null;message="";
        if(!s.equals("")) {
            Lexer L=new Lexer();
            char ch;
            if(s.equals("\n")) {
                line++; //判断行
                System.out.println("fsfsfsf");
            }
            if(!s.equals("\n")) {
                if(s.equals("main")||s.equals("int")||s.equals("real")||s.equals("char")||s.equals("else")||s.equals("if")) {
                    value=KEYWORD;
                    message="关键字";
                } else if(s.equals("|")||s.equals(";")||s.equals("[")||s.equals("++")||s.equals(":=")||s.equals("--")||s.equals("||")||s.equals("<>")||s.equals("$")||s.equals("@")||s.equals("~")||s.equals("#")||s.equals(",")||s.equals("?")||s.equals(":")||s.equals("^")||s.equals("%")||s.equals("`")) {
                    value=ERROR;
                    err="存在特殊字符";
                    message="无法识别";
                } else if(s.equals("(")) // 分格符
                {
                    value=LP;
                    message="分格符";
                } else if(s.equals(")")) {
                    value=RP;
                    message="分格符";
                } else if(s.equals("{")) {
                    value=LP;
                    message="分格符";
                } else if(s.equals("}")) {
                    value=RP;
                    message="分格符";
                } else if(s.equals(";")) {
                    value=SEMI;
                    message="分格符";
                } else if(s.equals("<")) {
                    value=LY;
                    message="关系符";
                } else if(s.equals("<=")) {
                    value=RY;
                    message="关系符";
                } else if(s.equals("==")) {
                    value=YY;
                    message="关系符";
                } else if(s.equals(">=")) {
                    value=LD;
                    message="关系符";
                } else if(s.equals(">")) {
                    value=RD;
                    message="关系符";
                } else if(s.equals("!=")) {
                    value=BD;
                    message="关系符";
                } else if(s.equals("=")) {
                    value=DYH;
                    message="运算符";
                } else if(s.equals("&&")) {
                    value=CC;
                    message="关系符";
                } else if(s.equals("+")) {
                    value=PLUS;
                    message="运算符";
                } else if(s.equals("-")) {
                    value=MINUS;
                    message="运算符";
                } else if(s.equals("*")) {
                    value=STAR;
                    message="运算符";
                } else if(s.equals("/")) {
                    value=DIV;
                    message="运算符";
                } else if(s.equals("'")) {
                    {
                        value=LF;
                        message="运算符";
                    }
                } else if(isNumeric(s)) {
                    err=L.conScan(s);
                    if(err.equals("No")) {
                        err=L.outBang(s);
                        if(err.equals("No")) {
                            message="常量";
                            value=CONST;
                        }else{
                            message="无法识别";
                            value=ERROR;
                        }
                    }else{
                        message="无法识别";
                        value=ERROR;
                    }
                    
                    
                } else   //变量
                {
                    
                    err=L.varScan(s);
                    if(err.equals("No")){
                        value=EARIVALE;
                        message="变量";
                    }else{
                        message="无法识别";
                        value=ERROR;
                    }
                    
                }
            }
            name=s; //名称
        }
        
    }
    public static boolean isNumeric(String str) //判断字符是否都为数字组成还是点数
    {
        Pattern pattern = Pattern.compile("[0-9|.]*");
        Matcher isNum = pattern.matcher(str);
        if( !isNum.matches() ) {
            return false;
        }
        return true;
    }
    public String getName(){
        return name;
    }
    public int getValue(){
        return value;
    }
    public int getLine(){
        return line;
    }
    public String[] getS(){
        return Scanner.s;
    }
    public int[] getCol(){
        return lie;
    }
    public String getErr(){
        return err;
    }
    public String getMessage(){
        return message;
    }
    public String getZushierr(){
        return this.zushi;
    }
}
class Lexer{
    public String varScan(String s){
        if(this.isHanzi(s)){
            return "存在汉字不能为汉字等";
        }
        if(s.indexOf('.')>=0){
            return "无法识别字符";
        }
        if(Character.isDigit(s.charAt(0)))
            return "变量不能以数字开头";
        if(s.length()>8)
            return "变量越界不能大8位";
        return "No";
    }
    public String conScan(String s){
        if(s.length()>1) {
            if(notCon(s)) {
                if(s.charAt(1)=='.') {
                    return "No";
                }
                return "常量整数不能以0开头";
            }
        }
        if(notFloat(s)) {
            if(this.isNum(s)) {
                return "No";
            }
            return "什么浮点数存在多个点的";
        }
        
        
        return "No";
    }
    public String outBang(String s) {
        if(Double.valueOf(s).doubleValue()>65535)
            return "常量越界不能大于63335";
        if(Double.valueOf(s).doubleValue()<-65535)
            return "常量越界不能小于-65535";
        return "No";
    }
    public  boolean notFloat(String str) {
        Pattern patter = Pattern.compile("[0-9]+.[0-9]+");
        Matcher notFloat = patter.matcher(str);
        if(notFloat.matches()) {
            return false;
        }
        return true;
    }
    public boolean notCon(String str) {
        Pattern patter = Pattern.compile("0[0-9]*[.][0-9]*");
        Matcher notCon = patter.matcher(str);
        if(notCon.matches()) {
            return true;
        }
        return false;
    }
    public static boolean isNum(String str) //判断字符是否都为数字组成123as
    {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if( !isNum.matches() ) {
            return false;
        }
        return true;
    }
    public static boolean isHanzi(String str) //判断字符是否都为是汉字
    {
        Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]*");
        Matcher isNum = pattern.matcher(str);
        if( !isNum.matches() ) {
            return false;
        }
        return true;
    }
    
}

⌨️ 快捷键说明

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