2016-12-17 6 views
-2

У меня проблема с этим кодом, я пытаюсь создать сканер для моего проекта в курсе компилятора, сканер принимает любые данные от пользователя и отделяет его от токенов. : печатать каждый токен и его тип (например: номер, идентификатор, ключевое слово, плюс знак ... и т. д.) и, наконец, печатать количество токенов.построить сканер с stringtokenizer

я объявили две функции, одна, чтобы определить, если входной является Java зарезервировано ключевое слово или нет, а второй, чтобы определить, если входной является идентификатором или нет ..

первая функция, которая определяет, если вход является ключевым словом java reserved или не работает хорошо, но у меня есть проблема в объявлении второй функции, которая определяет, является ли вход идентификатором или нет. Когда я ввел зарезервированное ключевое слово, выход: это зарезервировано слово и напечатать этот вход многократно.

Вот мой код:

package My_Scanner; 
import java.util.Scanner; 
import java.util.StringTokenizer; 

public class MyScanner 
{ 

    private static void isOperator(String s) 
    { 
     if (s.equals("+")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Plus Sign"); 
     } 

     else if (s.equals("-")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Minus Sign"); 
     } 

     else if (s.equals("*")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Multiply Sign"); 
     } 

     else if (s.equals("/")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Divide Sign"); 
     } 

     else if (s.equals("=")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Assignment Operator"); 
     } 

     else if (s.equals("%")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is percent Operator"); 
     } 

     else if (s.equals(".")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Full Stop"); 
     } 
    } 

    private static void isReservedWord(String s) 
    { 
     for (int i = 0; i < reserved_Keywords.length; i++) 
     { 
      if (s.equals(reserved_Keywords[i])) 
      { 
       System.out.print(s + "\t"); 
       System.out.println("Is Reserved Keyword"); 
      } 
     } 
    } 


    private static boolean isOpeningBracket(String s) 
    { 
     return ( s.equals("(") | s.equals("{") | s.equals("[") | s.equals("<") ); 
    } 

    private static boolean isClosingBracket(String s) 
    { 
     return ( s.equals(")") | s.equals("}") | s.equals("]") | s.equals(">") ); 
    } 

    private static void isIdentifier(String s) 
    { 
     boolean identifier = true; 
     if (!isOpeningBracket(s) && !isClosingBracket(s)) 
     { 
      for (int i = 0; i < reserved_Keywords.length; i++) { 
       if (s.equals(reserved_Keywords[i])) 
       { 
        identifier = false; 
        break; 
       } 
      } 
     } 

     if(identifier) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Identifier"); 
     } 
    } 

    static final String reserved_Keywords[] = { "abstract", "assert", "boolean", 
      "break", "byte", "case", "catch", "char", "class", "const", 
      "continue", "default", "do", "double", "else", "extends", "false", 
      "final", "finally", "float", "for", "goto", "if", "implements", 
      "import", "instanceof", "int", "interface", "long", "main", "native", 
      "new", "null", "package", "private", "protected", "public", 
      "return", "short", "static", "strictfp", "string", "super", "switch", 
      "synchronized", "this", "throw", "throws", "transient", "true", 
      "try", "void", "volatile", "while" }; 

    public static void main(String[] args) 
    { 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Enter Your Text: "); 
     String str = sc.nextLine(); 
     StringTokenizer st = new StringTokenizer(str); 
     int numofTokens = st.countTokens(); 
     while(st.hasMoreTokens()) 
     { 
      String TOKEN = st.nextToken(); 

      isOperator(TOKEN); 
      isReservedWord(TOKEN); 
      isIdentifier(TOKEN); 
      if (isOpeningBracket(TOKEN)) 
      { 
       System.out.print(TOKEN + "\t"); 
       System.out.println("Is Left Bracket"); 
      } 
      else if (isClosingBracket(TOKEN)) 
      { 
       System.out.print(TOKEN + "\t"); 
       System.out.println("Is Right Bracket"); 
      } 
     } 
     sc.close(); 
     System.out.println("Number of Tokens = " + numofTokens); 
    } 
} 

ответ

1

Это потому, что else размещен неправильно. Он просматривает все элементы и печатает заявление в else каждый раз. Вместо этого нужно напечатать, что только один раз после того, как цикл закончен, попробуйте следующий код:

private static void isIdentifier(String s) { 
    boolean identifier = true; 
    for (int i = 0; i < reserved_Keywords.length; i++) { 
     if (s.equals(reserved_Keywords[i])) { 
      identifier = false; 
      break; 
     } 
    } 

    if(identifier){ 
     System.out.print(s + "\t"); 
     System.out.println("Is Identifier"); 
    } 
} 

EDIT

Для обработки открытия и закрытия кронштейна, вы можете проверить, для тех, кто перед вызовом методов в проверить идентификаторы и continue петлю, если вы обнаружите какие-либо из этих символов, например:

while(st.hasMoreTokens()){ 
    String TOKEN = st.nextToken(); 
    if (isOpeningBracket(TOKEN)){ 
     System.out.print(TOKEN + "\t"); 
     System.out.println("Is Left Bracket"); 
     continue; 
    } 
    else if (isClosingBracket(TOKEN)){ 
     System.out.print(TOKEN + "\t"); 
     System.out.println("Is Right Bracket"); 
     continue; 
    } 
    isOperator(TOKEN); 
    isReservedWord(TOKEN); 
    isIdentifier(TOKEN); 
} 
+0

Спасибо, ваш ответ работает хорошо .. –

+0

но когда я пытаюсь проверить этот вход скобки или операторы я есть такая же проблема –

+0

Спасибо, ваш ответ работает хорошо .. но я не понимаю, почему вы использовали 'continue' –

Смежные вопросы