⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 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 + -