Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用stringtokenizer构建扫描程序_Java_Stringtokenizer - Fatal编程技术网

Java 使用stringtokenizer构建扫描程序

Java 使用stringtokenizer构建扫描程序,java,stringtokenizer,Java,Stringtokenizer,我在这段代码中遇到了一个问题,我试图在编译器课程中为我的项目构建一个扫描器,扫描器从用户那里获取任何输入,并将其分离为令牌。。输出将是:打印每个令牌及其类型(如:数字、标识符、关键字、加号等),最后打印令牌的数量 我声明了两个函数,一个用于确定输入是否为java保留关键字,第二个用于确定输入是否为标识符 确定输入是否为java保留关键字的第一个函数运行良好,但我在确定输入是否为标识符的第二个函数的声明中遇到了一个问题。。当我输入一个保留关键字时,输出是:这是一个保留字,并多次打印此输入是标识符

我在这段代码中遇到了一个问题,我试图在编译器课程中为我的项目构建一个扫描器,扫描器从用户那里获取任何输入,并将其分离为令牌。。输出将是:打印每个令牌及其类型(如:数字、标识符、关键字、加号等),最后打印令牌的数量

我声明了两个函数,一个用于确定输入是否为java保留关键字,第二个用于确定输入是否为标识符

确定输入是否为java保留关键字的第一个函数运行良好,但我在确定输入是否为标识符的第二个函数的声明中遇到了一个问题。。当我输入一个保留关键字时,输出是:这是一个保留字,并多次打印此输入是标识符

这是我的密码:

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);
    }
}
打包My_扫描仪;
导入java.util.Scanner;
导入java.util.StringTokenizer;
公共类MyScanner
{
专用静态空隙等参器(字符串s)
{
如果(s.等于(“+”)
{
系统输出打印(s+“\t”);
System.out.println(“是加号”);
}
否则,如果(s.等于(“-”)
{
系统输出打印(s+“\t”);
System.out.println(“是减号”);
}
如果(s.等于(“*”),则为else
{
系统输出打印(s+“\t”);
System.out.println(“是乘法符号”);
}
否则,如果(s.等于(“/”)
{
系统输出打印(s+“\t”);
System.out.println(“是分号”);
}
如果(s.equals(“=”),则为else
{
系统输出打印(s+“\t”);
System.out.println(“Is赋值运算符”);
}
否则,如果(s.等于(“%”)
{
系统输出打印(s+“\t”);
System.out.println(“是百分比运算符”);
}
否则,如果(s.等于(“.”)
{
系统输出打印(s+“\t”);
System.out.println(“是句号”);
}
}
私有静态void为reservedword(字符串s)
{
对于(int i=0;i
这是因为
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");
    }
}

但是当我尝试检查这个输入是否是括号或运算符时,我有同样的问题谢谢,你的答案很好。但是我不明白为什么你使用
继续
继续
来跳过当前迭代循环的其余执行,并从下一个循环开始。
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);
}