2016-03-28 63 views
0

我正在尝试使用Lexer来确定输入是否包含String/Integer/Double/etc。我已经成功地确定了我是否正在处理除字符串之外的其他字符串,但是我无法确定如何处理字符串部分。确定Java中字符串的结尾

所以我们可以说我有三个输入:

input = "\"asd\"" 
input2 = "\"The string \"String\" is really great\"5432" 
input3 = "\"The string \"String\" is really great\"5432"\One more\"" 

Expected output from: 
input = <STRING:asd> //Works with current code 
input2 = <STRING:The string "String" is really great><INTEGER 5432> //Broken 
input3 = <STRING:The string "String" is really great><INTEGER 5432> <STRING:One more>//ALSO BROKEN 

输出处理等做工作,所以这不是问题,问题是处理字符串的结尾。 可以很容易地处理不包含引号字符串,这是目前我是如何处理它:

StringBuilder sb = new StringBuilder(); 
    int count = 1; 
    pos++; 
    current = input.charAt(pos); 
    boolean last = false; 
    char next = input.charAt(pos+1); 
    while (current != '"'){ 
     sb.append(current); 
     pos++; 
     current = input.charAt(pos); 
     next = input.charAt(pos+1); 
    } 
    tokens.add(new Token(TokenType.STRING,sb.toString())); 

现在,我的代码,当第一引号出现在字符串出现的问题(见输入2或输入3例如)。我通过char检查输入字符,else-if分支是由引号开始确定的,这就是为什么有一个pos ++和当前更新(例如input2中的'T'字符)。

我如何确定字符串是否已结束(5432是input2中的整数而不是第一个字符串的部分)?

+0

您是否尝试过使用'input.length'属性来循环,直到达到您正在解析的字符串的长度? – Phoenix

+0

嗯,我可以做到这一点,但我不明白它可以如何帮助我。如果我有一个字符串“数字是”5324“”我如何确定它是一个字符串不是STRING,INTEGER,STRING。 – Banana

+0

为什么直接获取你的字符串之间的函数'split()'有什么不同?\t“char? – Phoenix

回答

0

因此,基本上按照Lexer的说法,从输入3输出STRING,INT,STRING在我的情况下是正确的,因为使用标记\" doesen't只是剪切它,我不得不在字符串中创建一个引号标记,所以\\\"削减它:两个反斜杠中的第一个将显示一个反斜杠本身\和反斜杠和引号\"将显示在字符串中的引号。显示的字符串总共为\",这只是引号的标记。