问题描述
我正在尝试解析一个句子,同时将数字转换为数字表示。
三个苹果
解析并转换为
3个苹果
使用此简单代码,我实际上可以正确地解析句子并将 3 转换为 3 ,但是当我尝试展平结果时, 3 恢复为 3 。
Parser three() => string('three').trim().map((value) => '3');
Parser apples() => string('apples').trim();
Parser sentence = three() & apples();
// this produces Success[1:13]: [3,apples]
print(sentence.parse('three apples'));
// this produces Success[1:13]: three apples
print(sentence.flatten().parse('three apples'));
我错过了什么吗? 扁平化行为正确吗?
预先感谢 L
解决方法
是的,这是flatten的记录行为:它丢弃解析器的结果,并在读取的输入中返回消耗范围的子字符串。 >
从问题上不清楚您期望什么?
- 您可能要使用token解析器:
sentence.token().parse('three apples')
。这将产生一个Token
对象,其中包含已解析列表[3,'apples']
至Token.value和已消耗的输入字符串'three apples'
至Token.input。 - 或者,您可能希望使用自定义mapping function来转换已解析的列表:
sentence.map((list) => '${list[0]} ${list[1]}')
产生'3 apples'
。