Я бы написал простой лексер, который распознает слова без цифр и числа, игнорирующие пробелы.Почему этот простой jparsec lexer не удается?
Я написал следующий код, используя jparsec v3.0:
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);
Но следующий тест не пройден за исключением org.jparsec.error.ParserException: line 1, column 7: EOF expected, 1 encountered
. Вместо этого, используя строку «abc cd 123», синтаксический анализ выполняется успешно.
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);
На ваш взгляд, что это не так?
не соответствует вашим лексемам списка будет ли '«а CD 123»', так как вы лексический на основе пробельного? – Aurora0001
Согласно документации, 'Parser.lexer (...)' должен запускать синтаксический анализатор ('токенизатор'), повторно игнорируя шаблон, распознаваемый делителем (' WHITESPACES') до и после каждого события. Неясно, является ли разделитель необязательным, поэтому я ожидаю, что полученный лексер будет соответствовать «abc», затем проигнорирует пробел, затем сопоставляет «cd» и, наконец, соответствует «123». – maurocchi