📄 scanner.java
字号:
import java.io.*;
import java.util.*;
import java.text.*;
public class Scanner
{
FileReader reader;
StreamTokenizer st;
ArrayList tokens=new ArrayList(); //hier werden Tokens gespeichert
Hashtable lines=new Hashtable(); //hier werden Zeilen gespeichert
int i=0; //Z鋒ler f黵 getNextToken() und touchToken()
TransHash funktionsnamen=new TransHash("funktion"); //Tabelle mit allen Funktionsnamen
TransHash RiesArrayNamen=new TransHash("RiesArray");
/**
* Aufgabe des Scanners ist Tokens aus einer Datei auszulesen,
* sie zusammenzuf黦en (z.B. ":=") und den Typ anzupassen
* @param String filename
*/
public Scanner(String filename)
{
try
{
FileReader reader=new FileReader(filename);
BufferedReader br=new BufferedReader(reader);
st=new StreamTokenizer(br);
st.resetSyntax();
st.wordChars('A','z');
st.wordChars('0','9');
st.ordinaryChar('[');
st.ordinaryChar(']');
st.ordinaryChar('=');
st.slashSlashComments(true);
st.whitespaceChars(0,' ');
st.eolIsSignificant(false);
read_tokens();
compose();
adjustType();
adjustNumberTokens(0);
}
catch(FileNotFoundException e)
{
System.out.println("Could not open"+" "+filename);
System.exit(1);
}
}
void read_tokens()
{
try
{
while(st.nextToken()!=StreamTokenizer.TT_EOF)
{
switch(st.ttype)
{
case StreamTokenizer.TT_WORD :
int type=check(st.sval);
tokens.add(new Token(st.sval,st.lineno(),type));
break;
default :
tokens.add(new Token(String.valueOf((char)st.ttype),st.lineno(),0));
break;
}
}
}
catch(IOException e)
{
System.out.println("st.nextToken() unsuccessful");
}
}
/**
Die Methode compose() f黦t Tokens zusammen
Das Ergebnis sind Tokens wie :=,!=,<=,>=
*/
void compose()
{
for(int a=0;a<tokens.size()-1;a++)
{
Token t=(Token)tokens.get(a);
Token t1=(Token)tokens.get(a+1);
int line=t.getLineNumber();
int type=t.getType();
String str=t.toString();
String str1=t1.toString();
if(str.equals(":") && str1.equals("="))
{
tokens.remove(a+1);
tokens.set(a,new Token(":=",line,type));
}
}
for(int a=0;a<tokens.size()-1;a++)
{
Token t=(Token)tokens.get(a);
Token t1=(Token)tokens.get(a+1);
int line=t.getLineNumber();
int type=t.getType();
String str=t.toString();
String str1=t1.toString();
if(str.equals("<") && str1.equals("="))
{
tokens.remove(a+1);
tokens.set(a,new Token("<=",line,type));
}
}
for(int a=0;a<tokens.size()-1;a++)
{
Token t=(Token)tokens.get(a);
Token t1=(Token)tokens.get(a+1);
int line=t.getLineNumber();
int type=t.getType();
String str=t.toString();
String str1=t1.toString();
if(str.equals(">") && str1.equals("="))
{
tokens.remove(a+1);
tokens.set(a,new Token(">=",line,type));
}
}
for(int a=0;a<tokens.size()-1;a++)
{
Token t=(Token)tokens.get(a);
Token t1=(Token)tokens.get(a+1);
int line=t.getLineNumber();
int type=t.getType();
String str=t.toString();
String str1=t1.toString();
if(str.equals("!") && str1.equals("="))
{
tokens.remove(a+1);
tokens.set(a,new Token("!=",line,type));
}
}
}
/**
Die Methode adjustType() pr黤t , ob es bei Token um einen Array-bzw. Funktionsname handelt
und passt entsprechend den Typ des Tokens an
*/
void adjustType()
{
for (int i=0;i<tokens.size();i++)
{
Token t=(Token)tokens.get(i);
if(t.toString().equals("["))
{
Token t1=(Token)tokens.get(i-1);
t1.setType(2);
tokens.set(i-1,t1);
}
try
{
Token t2=(Token)tokens.get(i+1);
if(t.toString().equals("function") && (!(t2.toString().equals(";"))))
{ t2.setType(4);
tokens.set(i+1,t2);
funktionsnamen.get(t2); } //Der Funktionsname wird in die Tabelle eingef黦t
if((t.getType()==0) && (t2.toString().equals("(")))
{
t.setType(4);
tokens.set(i,t);
}
if(t.toString().equals("array") && (!(t2.toString().equals(";"))))
{ t2.setType(8);
tokens.set(i+1,t2);
RiesArrayNamen.get(t2); } //Der RiesArrayName wird in die Tabelle eingef黦t
}
catch(IndexOutOfBoundsException e)
{ }
//Den Vergleichsoperatoren wird Typ 5 zugeordnet
if(t.toString().equals("<")||t.toString().equals(">")||t.toString().equals("<=")||t.toString().equals(">=")||
t.toString().equals("=")||t.toString().equals("!="))
{
t.setType(5);
tokens.set(i,t);
}
//Den arithmetischen Operatoren wird Typ 6 zugeordnet
if(t.toString().equals("+")||t.toString().equals("-")||t.toString().equals("*")||t.toString().equals(":"))
{
t.setType(6);
tokens.set(i,t);
}
//Den Sonderzeichen wird Typ 7 zugeordnet
if(t.toString().equals(":=")||t.toString().equals(";"))
{
t.setType(7);
tokens.set(i,t);
}
}
}
/**
Pr黤t , ob der Token ein Schl黶selwort ist
@param String s
@return int
*/
int check(String s)
{
if(s.equals("begin")||s.equals("end")||s.equals("if")||s.equals("else")||s.equals("for")||s.equals("while")||s.equals("function")||
s.equals("then")||s.equals("to")||s.equals("do")||s.equals("not")||s.equals("and")||s.equals("or") )
return 1;
else
return 0;
}
/**
Pr黤t , ob der Token eine Zahl ist und passt entsprechend den Typ des Tokens an
@param int pos
*/
void adjustNumberTokens(int pos)
{
NumberFormat formatter=NumberFormat.getNumberInstance();
for(int position=pos;position<tokens.size();position++)
{
try
{
Token t=(Token)tokens.get(position);
String s=t.toString();
Number n=formatter.parse(s);
t.setType(3);
tokens.set(position,t);
}
catch(ParseException e)
{
}
}
}
/**
Gibt den n鋍hsten Token zur點k
@return Token
*/
Token getNextToken()
{
return (Token)tokens.get(i++);
}
/**
Gibt den aktuellen Token zur點k
@return Token
*/
Token touchToken()
{
return (Token)tokens.get(i);
}
/**
Gibt den angeforderten Token zur點k
@return Token
*/
Token touchToken(int i)
{
return (Token)tokens.get(i);
}
/**
Gibt den angeforderten raletiv zur jetzigen Position stehenden Token zur點k
@return Token
*/
Token touchRelToken(int i)
{
return (Token)tokens.get(this.i + i);
}
/**
* Die Methode getLine(int) gibt eine Zeile zur點k und speichert diese Zeile
* in einer Hashtable , damit sp鋞er nicht die ganze Datei nach dieser Zeile
* abgesucht werden muss.
* @param int line
* @return String
*/
String getLine(int line)
{
String result=new String();
Integer key=new Integer(line);
if(lines.containsKey(key)) //pr黤t,ob die Zeile in der Hashtable enthalten ist
{
result=lines.get(key).toString(); //gibt die Zeile aus der Hashtable zur點k
}
else
{
for(int r=0;r<tokens.size();r++)
{
Token t=(Token)tokens.get(r);
String s=t.toString();
if(t.getLineNumber()==line)
{
result+=s;
}
}
}
lines.put(key,result);
return result;
}
/**
* Die Methode getFunktionsnamen() gibt die Tabelle mit allen Funktionsnamen zur點k
* @return TransHash
*/
TransHash getFunktionsnamen()
{
return funktionsnamen;
}
TransHash getRiesArrayNamen()
{
return RiesArrayNamen;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -