首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的PetitParser映射函数中缺少空格

我的PetitParser映射函数中缺少空格
EN

Stack Overflow用户
提问于 2021-04-04 18:51:45
回答 1查看 24关注 0票数 0

我试图解析包含函数调用的普通文本。

代码语言:javascript
复制
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('"');
}

这是接近,但我有一些问题的正常文本部分。当我想要映射这些的时候,点就在那里,但是空格却不见了。

代码语言:javascript
复制
Parser word() => super.word().map((each) => WordValueWidget(each));

当我解析"Hello World“时首先是"Hello",然后是null,然后是"World",".“我希望它首先是"Hello",“”,然后是"World",".“。

感谢您的帮助,并为我糟糕的英语表示抱歉:)

EN

回答 1

Stack Overflow用户

发布于 2021-04-06 05:35:50

我怀疑wordToken已经消耗了单词字符之后的所有空格(由于您的标记定义中的.trim()操作)。则whitespace().plus() | ref(token, '.') | whitespace()中的所有选项都不匹配,并且.optional()返回null

也就是说,很难从你发布的那种庞大而复杂的语法中辨别出来。理想情况下,您应该尝试将问题分解为更小且更易于管理的部分,然后可以独立测试和修复这些部分。一个可重复性最低的示例将使我更容易提供一个直接适用的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66940476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档