数字を認識する単純なレクサーを書きます。数字はで、数字は空白を無視します。なぜこの単純なjparsecレクサーが失敗するのですか?
私は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);
あなたの意見では間違っていますか?
は、あなたのトークンリストと同等には、 '「ABCのCD 123」'と思いませんか? – Aurora0001
文書によると、 'Parser.lexer(...)'は、パーサー( 'tokenizer')を各文字列の前と後に区切り文字(' WHITESPACES')で認識されるパターンを繰り返し無視して実行する必要があります。区切り文字がオプションかどうかは分かりませんので、結果のレクサーが "abc"にマッチし、その後空白を無視して "cd"にマッチし、最後に "123"にマッチすると期待します。 – maurocchi