我使用ANTLRWorks创建了以下Lexer。 (另见http://bkiers.blogspot.com/2011/03/2-introduction-to-antlr.html#intro)
// CSVLexer.g
lexer grammar CSVLexer;
@lexer::header {
package graphica.parsers;
}
Comma
: ','
;
LineBreak
: '\r'? '\n'
| '\r'
;
SimpleValue
: ~(',' | '\r' | '\n' | '"')+
;
QuotedValue
: '"' ('""' | ~'"')* '"'
;
我使用以下Java类来测试Lexer。
/**
*
* @author Nilo
*/
import org.antlr.runtime.*;
public class CSVLexerTest {
public static void main(String[] args) throws Exception {
// the input source
String source =
"val1, value2, value3, value3.2" + "\n"
+ "\"line\nbreak\",ABAbb,end";
// create an instance of the lexer
CSVLexer lexer = new CSVLexer(new ANTLRStringStream(source));
// wrap a token-stream around the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// traverse the tokens and print them to see if the correct tokens are created
// tokens.toString();
int n = 1;
for (Object o : tokens.getTokens()) {
CommonToken token = (CommonToken) o;
System.out.println("token(" + n + ") = " + token.getText().replace("\n", "\\n"));
n++;
}
}
}
上面的类(来自同一个教程)不会产生任何输出。但是,如果我在令牌循环之前插入一个tokens.toString(),那么将按预期打印输出。
注意:我使用ANTLWorks 1.4.3,ANTLR 3.4,在Windows 7上使用JDK 1.7 / 64bit
问题:我不明白这一点。请解释。应该有一种方法可以在没有tokens.toString()
的情况下使其工作