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