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 + -
显示快捷键?