commonparses method

  1. @override
Map<String, List<Parse>> commonparses(
  1. Map<String, List<Parse>>? currentCommon
)
override

You don't have to merge like this return { ...currentCommon, your Def: bla bla bla} just give your own lib common parse rules => { your Def: bla bla bla } currentCommon is for you to check what have been loaded if Needed.

Implementation

@override
Map<String, List<Parse>> commonparses(
    Map<String, List<Parse>>? currentCommon) {
  return {
    'string_literal': [
      // Raw strings.
      Parse(r'r"""([\w\W]*?)"""', Token.StringDouble),
      Parse(r"r'''([\w\W]*?)'''", Token.StringSingle),
      Parse(r'r"(.*?)"', Token.StringDouble),
      Parse(r"r'(.*?)'", Token.StringSingle),
      // Normal Strings.
      Parse(r'"""', Token.StringDouble, ['string_double_multiline']),
      Parse(r"'''", Token.StringSingle, ['string_single_multiline']),
      Parse(r'"', Token.StringDouble, ['string_double']),
      Parse(r"'", Token.StringSingle, ['string_single'])
    ],
    'string_common': [
      Parse(
          r"\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]*\}|[a-z'"
          r'"$\\])',
          Token.StringEscape),
      Parse.bygroups(
          r'(\$)([a-zA-Z_]\w*)', [Token.StringInterpol, Token.Name]),
      Parse.bygroups(r'(\$\{)(.*?)(\})', [
        Token.StringInterpol,
        Token.RecurseSameLexer,
        Token.StringInterpol,
      ])
    ],
    'string_double': [
      Parse(r'"', Token.StringDouble, [POP2]),
      Parse(r'[^"$\\\n]+', Token.StringDouble),
      Parse.include('string_common'),
      Parse(r'\$+', Token.StringDouble)
    ],
    'string_double_multiline': [
      Parse(r'"""', Token.StringDouble, [POP2]),
      Parse(r'[^"$\\]+', Token.StringDouble),
      Parse.include('string_common'),
      Parse(r'(\$|\")+', Token.StringDouble)
    ],
    'string_single': [
      Parse(r"'", Token.StringSingle, [POP2]),
      Parse(r"[^'$\\\n]+", Token.StringSingle),
      Parse.include('string_common'),
      Parse(r'\$+', Token.StringSingle)
    ],
    'string_single_multiline': [
      Parse(r"'''", Token.StringSingle, [POP2]),
      Parse(r"[^'$\\]+", Token.StringSingle),
      Parse.include('string_common'),
      Parse(r"(\$|\')+", Token.StringSingle)
    ],
    INCLUDE_IMPORT_NAMES_AND: [
      Parse(r'[a-zA-Z_$]\w*', Token.Name),
      Parse.bygroups(
          r'(\s*)(\,)(\s*)', [Token.Text, Token.Punctuation, Token.Text]),
      Parse(r'\s+', Token.Text, [POP]),
    ],
    IMPORT_NAMES_AND: [
      Parse.include(INCLUDE_IMPORT_NAMES_AND),
      Parse.empty([POP])
    ],
    IMPORT_NAMES_AND_OREND: [
      Parse.include(INCLUDE_IMPORT_NAMES_AND),
      Parse.include(IMPORT_NAME_END),
    ],
    IMPORT_NAME_AND: [
      Parse(r'[a-zA-Z_$]\w*', Token.Name),
      Parse(r'\s+', Token.Text, [POP]),
      Parse.empty([POP])
    ],
    IMPORT_NAME_END: [
      Parse.bygroups(r'([a-zA-Z_$]\w*)' r'(\s*)(\;)',
          [Token.Name, Token.Text, Token.Punctuation],

          /// 此处需要修改退栈逻辑(根据情况退栈) 解决共用结束规则的问题
          [ONPOP('pop->root', ELSE: POPROOT)]),
      Parse.empty([POP])
    ],
    REQUIRED_NAME_END: [
      Parse.bygroups(r'([a-zA-Z_$]\w*)' r'(\s*)(\;)',
          [Token.Name, Token.Text, Token.Punctuation], [POP])
    ],
  };
}