.+?
レクサールールの最後では、常に1文字に一致します。しかし.+
、可能な限り消費します。これは、ANTLR v3(v4もおそらく同様)のルールの最後では違法でした。
できることは、1つの文字を一致させ、パーサーでこれらを「接着」することです。
unknowns : Unknown+ ;
...
Unknown : . ;
編集
...しかし、私にはレクサーしかなく、パーサーはありません...
ああ、なるほど。nextToken()
次に、メソッドをオーバーライドできます。
lexer grammar Lex;
@members {
public static void main(String[] args) {
Lex lex = new Lex(new ANTLRInputStream("foo, bar...\n"));
for(Token t : lex.getAllTokens()) {
System.out.printf("%-15s '%s'\n", tokenNames[t.getType()], t.getText());
}
}
private java.util.Queue<Token> queue = new java.util.LinkedList<Token>();
@Override
public Token nextToken() {
if(!queue.isEmpty()) {
return queue.poll();
}
Token next = super.nextToken();
if(next.getType() != Unknown) {
return next;
}
StringBuilder builder = new StringBuilder();
while(next.getType() == Unknown) {
builder.append(next.getText());
next = super.nextToken();
}
// The `next` will _not_ be an Unknown-token, store it in
// the queue to return the next time!
queue.offer(next);
return new CommonToken(Unknown, builder.toString());
}
}
Whitespace : [ \t\n\r]+ -> skip ;
Punctuation : [.,:;?!] ;
Unknown : . ;
それを実行する:
java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Lex.g4
javac -cp antlr-4.0-complete.jar * .java
java -cp。:antlr-4.0-complete.jar Lex
印刷されます:
不明な「foo」
句読点'、'
不明な「バー」
句読点'。'
句読点'。'
句読点'。'