O que há de errado com este simples jflex código?
-
21-12-2019 - |
Pergunta
Eu estou aprendendo jflex, e escreveu uma mais simples jflex código, o que faz com que um único caractere #
:
import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
%%
%class PubspecLexer
%implements FlexLexer
%unicode
%type IElementType
%function advance
%debug
Comment = "#"
%%
{Comment} { System.out.println("Found comment!"); return PubTokenTypes.Comment; }
. { return PubTokenTypes.BadCharacter; }
Então eu gerar um PubspecLexer
classe, e experimentá-lo:
public static void main(String[] args) throws IOException {
PubspecLexer lexer = new PubspecLexer(new StringReader("#!!!!!"));
for (int i = 0; i < 3; i++) {
IElementType token = lexer.advance();
System.out.println(token);
}
}
Mas ele imprime 3 null
s:
null
null
null
Por isso não retorno Comment
nem BadCharacter
?
Solução
Não jflex problema, na verdade, é porque a idéia-flex alterações de uso original.
Quando usar o jflex para escrever o intellij idéia de plugins, estamos usando um patched "JFlex.jar" e de "idéia-flex.esqueleto", mais tarde define o zzRefill
método:
private boolean zzRefill() throws java.io.IOException {
return true;
}
Em vez do original:
private boolean zzRefill() throws java.io.IOException {
// ... ignore some code
/* finally: fill the buffer with new input */
int numRead = zzReader.read(zzBuffer, zzEndRead,
zzBuffer.length-zzEndRead);
// ... ignore some code
// numRead < 0
return true;
}
Notar que há uma zzReader
no código, e que contém a seqüência de caracteres #!!!!!
Eu transmitida.Mas a idéia-versão flex, que nunca é utilizado.
Assim, trabalhar com a idéia-versão flex, que eu deveria usá-lo assim:
public class MyLexer extends FlexAdapter {
public MyLexer() {
super(new PubspecLexer((Reader) null));
}
}
Então:
public static void main(String[] args) {
String input = "#!!!!!";
MyLexer lexer = new MyLexer();
lexer.start(input);
for (int i = 0; i < 3; i++) {
System.out.println(lexer.getTokenType());
lexer.advance();
}
}
Que impressões:
match: --#--
action [19] { System.out.println("Found comment!"); return PubTokenTypes.Comment(); }
Found comment!
Pub:Comment
match: --!--
action [20] { return PubTokenTypes.BadCharacter(); }
Pub:BadCharacter
match: --!--
action [20] { return PubTokenTypes.BadCharacter(); }
Pub:BadCharacter