Ich würde einen einfachen Lexer schreiben, der Wörter ohne Ziffern und Zahlen ignoriert whitespaces erkennt.Warum scheitert dieser einfache jparsec-Lexer?
final Parser<String> words = Patterns.isChar(CharPredicates.IS_ALPHA).many1().toScanner("word").source();
final Parser<String> nums = Patterns.isChar(CharPredicates.IS_DIGIT).many1().toScanner("num").source();
final Parser<Tokens.Fragment> tokenizer = Parsers.or(
words.map(it -> Tokens.fragment(it, "WORD")),
nums.map(it -> Tokens.fragment(it, "NUM")));
final Parser<List<Token>> lexer = tokenizer.lexer(Scanners.WHITESPACES);
Aber der folgende Test nicht mit der org.jparsec.error.ParserException: line 1, column 7: EOF expected, 1 encountered
Ausnahme:
ich den folgenden Code verwenden jparsec v3.0 geschrieben. Mit der Zeichenfolge "abc cd 123" ist das Parsen erfolgreich.
final List<Token> got = lexer.parse("abc cd123");
final List<Token> expected = Arrays.asList(
new Token(0, 3, Tokens.fragment("abc", "WORD")),
new Token(4, 2, Tokens.fragment("cd", "WORD")),
new Token(6, 3, Tokens.fragment("123", "NUM")));
assertEquals(expected, got);
Was ist Ihrer Meinung nach falsch?
wäre das Äquivalent zu Ihrer Token-Liste nicht '„abc cd 123“sein', da Sie lexing sind basierend auf Leerzeichen? – Aurora0001
Gemäß der Dokumentation sollte 'Parser.lexer (...)' den Parser ('Tokenizer') laufen lassen, wobei er das vom Delimeter erkannte Muster (' WHITESPACES') vor und nach jedem Auftreten wiederholt ignoriert. Es ist nicht klar, ob das Trennzeichen optional ist, daher würde ich erwarten, dass der resultierende Lexer mit "abc" übereinstimmt, dann ignoriert er das Leerzeichen, stimmt dann mit "cd" überein und stimmt schließlich mit "123" überein. – maurocchi