Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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中标记化时如何处理运算符(StreamTokenizer)_Java_Stream_Operators_Tokenize - Fatal编程技术网

在Java中标记化时如何处理运算符(StreamTokenizer)

在Java中标记化时如何处理运算符(StreamTokenizer),java,stream,operators,tokenize,Java,Stream,Operators,Tokenize,我正在用Java编写一个标记器,它必须处理运算符,标记之间不需要空格字符 我需要认识到类似“对于所提供的标记器类,这不是一个典型的场景。更像是一个完全成熟的解析器必须处理的事情。即使您需要手动构建这样的标记器,您可能会发现学习解析器生成器(如javacc或antlr)生成的代码是很有教育意义的。请关注它们如何处理”“向前看”,这就是你在这里要问的 除非这是一个不允许使用解析器生成器的家庭作业问题,否则使用解析器生成器将获得更好的结果。看起来StreamTokenizer有点基本 我建议您在Str

我正在用Java编写一个标记器,它必须处理运算符,标记之间不需要空格字符


我需要认识到类似“对于所提供的标记器类,这不是一个典型的场景。更像是一个完全成熟的解析器必须处理的事情。即使您需要手动构建这样的标记器,您可能会发现学习解析器生成器(如javacc或antlr)生成的代码是很有教育意义的。请关注它们如何处理”“向前看”,这就是你在这里要问的


除非这是一个不允许使用解析器生成器的家庭作业问题,否则使用解析器生成器将获得更好的结果。

看起来
StreamTokenizer
有点基本


我建议您在StreamTokenizer的基础上构建一个lexer。这个lexer所做的就是提供一个通常意义上的实际令牌流。也就是说,
StreamTokenizer
为您提供的是基本lexer的功能。您必须使用这些来制作您的高端版本


您必须非常明智地使用
nextToken()
pushBack()
。例如,在下面的示例中,我正在处理
nextToken()
将跳过空白,因此
++
++
将被视为相同的内容!

StreamTokenizer是处理此问题的非常基本的工具

您可以创建自己的前瞻函数来解决您的问题


您看到一个“看起来
StreamTokenizer
不是适合您的工具。+1.ANTLR()和JavaCC()都是优秀的解析器生成器。
if (token == '<')
        if (nextToken == '=')
            this.tokenList.add(27); // <=
        else
            // add 2 tokens separately
import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;

public class LexerTest 
{
    private StringReader r;

    public LexerTest(StringReader stringReader) {
        r = stringReader;
    }

    public static void main(String[] args) throws IOException 
    {
        String s = "test = test1 + (test2 * test3 * (test4 - 2);";
        new LexerTest(new StringReader(s)).printTokens();

        System.out.println("\n### Test 2 ###\n");
        s = "test = if(test1 < test2){ test3 = (test4 - 2);}";
        new LexerTest(new StringReader(s)).printTokens();

        System.out.println("\n### Test 3 ###\n");
        s = "test = if(test1 <= test2){ test3 = (test4 - 2);}";
        new LexerTest(new StringReader(s)).printTokens();

        System.out.println("\n### Test 4 ###\n");
        s = "test = if(test1 < test2){ test3 = (test4 << 2);}";
        new LexerTest(new StringReader(s)).printTokens();
    }

    private void printTokens() throws IOException 
    {
        StreamTokenizer st = new StreamTokenizer(r);
        st.eolIsSignificant(true);

        int token = st.nextToken();
        while (token != StreamTokenizer.TT_EOF) 
        {
            token = st.nextToken();
            switch (token) 
            {
            case StreamTokenizer.TT_NUMBER:
                double num = st.nval;
                System.out.println("Number found: " + num);
                break;
            case StreamTokenizer.TT_WORD:
                String word = st.sval;
                System.out.println("Word found: " + word);
                break;
            case '+':
                break;
            case '-':
                break;
            case '/':
                break;
            case '*':
                break;
            case '<':
            {
                int t = st.nextToken();
                switch(t)
                {
                case '=':
                    System.out.println("<=");
                    break;
                case '<':
                    System.out.println("<<");
                    break;
                    default:
                        st.pushBack();
                        System.out.println("<");
                        break;
                }
            }
            }
        }

    }
}