我试图解析包含函数调用的普通文本。
class EmmaGrammarDefinition extends GrammarDefinition {
const EmmaGrammarDefinition();
Parser start() => ref(value).plus().end();
Parser token(Object source, [String name]) {
if (source is String) {
return source.toParser(message: 'Expected ${name ?? source}').trim();
} else if (source is Parser) {
ArgumentError.checkNotNull(name, 'name');
return source.flatten('Expected $name').trim();
} else {
throw ArgumentError('Unknown token type: $source.');
}
}
Parser word() =>
ref(wordToken) &
(whitespace().plus() | ref(token, '.') | whitespace()).optional();
Parser call() =>
ref(wordToken) & ref(token, '(') & ref(value) & ref(token, ')');
Parser array() =>
ref(token, '[') & ref(elements).optional() & ref(token, ']');
Parser elements() =>
ref(value).separatedBy(ref(token, ','), includeSeparators: false);
Parser members() =>
ref(pair).separatedBy(ref(token, ','), includeSeparators: false);
Parser object() =>
ref(token, '{') & ref(members).optional() & ref(token, '}');
Parser pair() => (ref(wordToken)| ref(stringToken)) & ref(token, ':') & ref(value);
Parser value() =>
ref(call) |
ref(word) |
ref(stringToken) |
ref(numberToken) |
ref(object) |
ref(array) |
ref(trueToken) |
ref(falseToken) |
ref(nullToken);
Parser trueToken() => ref(token, 'true');
Parser falseToken() => ref(token, 'false');
Parser nullToken() => ref(token, 'null');
Parser stringToken() => ref(token, ref(stringPrimitive), 'string');
Parser numberToken() => ref(token, ref(numberPrimitive), 'number');
Parser wordToken() => ref(token, ref(wordPrimitive), 'word');
Parser characterPrimitive() =>
ref(characterNormal) | ref(characterEscape) | ref(characterUnicode);
Parser characterNormal() => pattern('^"\\');
Parser characterEscape() => char('\\') & pattern(jsonEscapeChars.keys.join());
Parser characterUnicode() => string('\\u') & pattern('0-9A-Fa-f').times(4);
Parser numberPrimitive() =>
char('-').optional() &
char('0').or(digit().plus()) &
char('.').seq(digit().plus()).optional() &
pattern('eE')
.seq(pattern('-+').optional())
.seq(digit().plus())
.optional();
Parser wordPrimitive() => letter().plus() & digit().plus().optional();
Parser stringPrimitive() =>
char('"') & ref(characterPrimitive).star() & char('"');
}这是接近,但我有一些问题的正常文本部分。当我想要映射这些的时候,点就在那里,但是空格却不见了。
Parser word() => super.word().map((each) => WordValueWidget(each));当我解析"Hello World“时首先是"Hello",然后是null,然后是"World",".“我希望它首先是"Hello",“”,然后是"World",".“。
感谢您的帮助,并为我糟糕的英语表示抱歉:)
发布于 2021-04-06 05:35:50
我怀疑wordToken已经消耗了单词字符之后的所有空格(由于您的标记定义中的.trim()操作)。则whitespace().plus() | ref(token, '.') | whitespace()中的所有选项都不匹配,并且.optional()返回null。
也就是说,很难从你发布的那种庞大而复杂的语法中辨别出来。理想情况下,您应该尝试将问题分解为更小且更易于管理的部分,然后可以独立测试和修复这些部分。一个可重复性最低的示例将使我更容易提供一个直接适用的解决方案。
https://stackoverflow.com/questions/66940476
复制相似问题