📄 ws_scan.java
字号:
package com.gyg.WordScanner;
import java.io.*;
import java.util.*;
public class WS_Scan implements WS_TypeCode
{
private char[] chs;
private int p;
public int curClass;
public String curValue;
public Set<WS_Const> constTable;//常量表
public Set<WS_Mark> markTable; //标识符表
public BufferedReader in;
public PrintWriter out;
WS_Scan(String inPath,String outPath) throws Exception
{
StringBuilder s=new StringBuilder();
in = new BufferedReader(new FileReader(inPath));
int c;
while((c=in.read())!= -1)
{
s.append((char)c);
}
String s1=s.toString();
chs=s1.toCharArray();
in.close();
out=new PrintWriter(new FileOutputStream(outPath));
p=0;
curClass=$INIT;
curValue=null;
constTable=new HashSet<WS_Const>();
markTable=new HashSet<WS_Mark>();
}
private void scan() throws Exception
{
int len=chs.length;
while(p<len)
{
curClass=$INIT;
curValue=null;
while(chs[p]==' '||chs[p]=='\t'||chs[p]=='\n'){
p++;
if(p==len)
return;
}
if(Character.isLetter(chs[p])||chs[p]=='_')
{
int st=p;
p++;
while(p<len&&Character.isLetterOrDigit(chs[p]))
{
p++;
}
curValue=new String(chs,st,p-st);
if(isReservedWord(curValue))
curClass=getType(curValue);
else
{
curClass=$MARK;
WS_Mark c=new WS_Mark(curClass,curValue);
if(!isVariable(c))
{
markTable.add(c);
}
}
out.println("("+curClass+","+curValue+")");
}
else if(Character.isDigit(chs[p]))
{
WS_Const c;
boolean isFloat=false;
int st=p;
p++;
while(p<len&&Character.isDigit(chs[p])||chs[p]=='.'||chs[p]=='e')
{
if(chs[p]=='.'||chs[p]=='e')
{
isFloat=true;
curClass=$FLOAT;
}
else
{
curClass=$INT;
}
p++;
}
if(chs[p-1]=='e')
{
throw new Exception("浮点型最后不能为'e'");
}
curValue=new String(chs,st,p-st);
if(isFloat)
{
c=new WS_Const(curClass,Float.parseFloat(curValue));
}
else
{
c=new WS_Const(curClass,Integer.parseInt(curValue));
}
constTable.add(c);
out.println("("+curClass+","+curValue+")");
}
else if(isStringStart(chs[p]))
{
char endc=getStringEnd(chs[p]);
p++;
int st=p;
while(p<len && chs[p]!=endc){
p++;
if(p==len)
throw new Exception("缺小"+endc+"!");
}
curValue=new String(chs,st,p-st);
curClass=$STRING;
WS_Const c=new WS_Const($STRING,curValue);
constTable.add(c);
out.println("("+curClass+","+curValue+")");
p++;
}
else
{
int st=p;
switch(chs[p])
{
case ',':
p++;
curClass=$COMMAND;
break;
case ';':
p++;
curClass=$SEMICOLON ;
break;
case ':':
p++;
curClass=$COLON;
break;
case '[':
p++;
curClass=$LBLACK ;
break;
case ']':
p++;
curClass=$RBLACK ;
break;
case '(':
p++;
curClass=$LPARENTHESES;
break;
case ')':
p++;
curClass=$RPARENTHESES;
break;
case '+':
p++;
curClass=$PLUS;
break;
case '-':
p++;
curClass=$MINUS;
break;
case '*':
p++;
curClass=$MULTIPLY;
break;
case '/':
p++;
curClass=$DIVIDE;
break;
case '%':
p++;
curClass=$MOD;
break;
case '=':
p++;
if(p<len&&chs[p]=='='){
curClass=$EQUAL;
p++;
}
else{
curClass=$BECOME;
}
break;
case '>':
p++;
if(p<len&&chs[p]=='='){
curClass=$GEQ;
p++;
}
else{
curClass=$GTR;
}
break;
case '<':
p++;
if(p<len&&chs[p]=='='){
curClass=$LEQ;
p++;
}
else{
curClass=$LSS;
}
break;
case '!':
p++;
if(p<len&&chs[p]=='='){
curClass=$NEQUAL;
p++;
}
else{
curClass=$NOT;
}
break;
case '&':
p++;
if(p<len&&chs[p]=='&'){
curClass=$lAND;
p++;
}
else{
curClass=$AND;
}
break;
case '|':
p++;
if(p<len&&chs[p]=='|'){
curClass=$LOR;
p++;
}
else{
curClass=$OR;
}
break;
default:
throw new Exception("存在非法字符->"+chs[p]);
}
if(p-st==1)
curValue=new String(chs,st,1);
else
curValue=new String(chs,st,2);
out.println("("+curClass+","+curValue+")");
}
}
out.close();
return;
}
private boolean isVariable(WS_Mark c)
{
return (markTable.contains(c));
}
private boolean isReservedWord(String s)
{
return WS_ReservedWord.res.containsKey(s);
}
private int getType(String s)
{
return WS_ReservedWord.res.get(s);
}
private boolean isStringStart(char c)
{
if(c=='\"' || c=='\'' || c=='[') //'\'' javascript有这种类型
return true;
else
return false;
}
private char getStringEnd(char c)
{
if(c=='\"')
return '\"';
else if(c=='\'')
return '\'';
else
return ']';
}
public static void main(String[] args)throws Exception
{
WS_Scan ws=new WS_Scan("C:/eclipse/workspace/WordScanner/1.txt","C:/eclipse/workspace/WordScanner/2.txt");
ws.scan();
System.out.println("********************************************************");
System.out.println("标识符列表:");
for(WS_Mark c:ws.markTable)
{
System.out.println(c);
}
System.out.println("********************************************************");
System.out.println("常量列表:");
for(WS_Const c:ws.constTable)
{
System.out.println(c);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -