{"id":16752945,"url":"https://github.com/bsutton/parser_tool","last_synced_at":"2026-02-05T15:32:09.129Z","repository":{"id":141378233,"uuid":"410684072","full_name":"bsutton/parser_tool","owner":"bsutton","description":"Parser tool is a real-time compiler and runtime engine for strongly typed PEG parsers","archived":false,"fork":false,"pushed_at":"2021-05-11T07:39:14.000Z","size":47,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-03T16:39:31.013Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bsutton.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-26T23:18:27.000Z","updated_at":"2022-02-14T19:39:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"d1505a59-b121-4da1-a9c9-f546cbe97876","html_url":"https://github.com/bsutton/parser_tool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bsutton/parser_tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsutton%2Fparser_tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsutton%2Fparser_tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsutton%2Fparser_tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsutton%2Fparser_tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bsutton","download_url":"https://codeload.github.com/bsutton/parser_tool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsutton%2Fparser_tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29124801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T14:05:12.718Z","status":"ssl_error","status_checked_at":"2026-02-05T14:03:53.078Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T02:48:44.784Z","updated_at":"2026-02-05T15:32:09.115Z","avatar_url":"https://github.com/bsutton.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# parser_tool\n\nVersion 0.1.1 (BETA)  \n\nParser tool is a real-time compiler and runtime engine for strongly typed PEG parsers.  \n\nParser tool contains libraries that allow you to create strongly typed PEG parsers. The tool contains a compiler that compiles a parser in real time and an engine to execute the compiled parsers.  \n\n### Advantages\n\n- Strongly typed parsers\n- Sufficiently high performance\n- Allows you to debug the parser through tracing support with information about the parsing progress\n- Expression notations are available during debugging\n- Allows you to print out grammar\n\n### Disvantages\n\n- Not as fast parsers as compared to parsers that compile directly into source code\n- The debugging process is not so clear and convenient\n\n### Planned features\n\n- Adding a semantic predicate\n\n### Example\n\n```dart\nimport 'package:parser_tool/grammar.dart';\nimport 'package:parser_tool/grammar_builder.dart';\nimport 'package:parser_tool/grammar_compiler.dart';\nimport 'package:parser_tool/grammar_heplers.dart';\n\nimport '_parse_number.dart';\n\nexport 'package:parser_tool/parse.dart';\n\nvoid main() {\n  final text = '''\n{\"rocket\": \"🚀 flies to the stars\"}\n''';\n  final state = ParseState(text);\n  final result = parser.parse(state);\n  if (result == null) {\n    throw state.buildError();\n  }\n\n  print(result.value);\n}\n\nfinal grammar = buildGrammar();\n\nfinal Parser parser = compileGrammar(grammar);\n\nGrammar buildGrammar() {\n  // Nonterminals\n  final array = Nonterminal\u003cList\u003e('array');\n  final json = Nonterminal('json');\n  final member = Nonterminal\u003cMapEntry\u003cString, dynamic\u003e\u003e('member');\n  final members = Nonterminal\u003cList\u003cMapEntry\u003cString, dynamic\u003e\u003e\u003e('members');\n  final object = Nonterminal\u003cMap\u003cString, dynamic\u003e\u003e('object');\n  final value = Nonterminal('value');\n  final values = Nonterminal\u003cList\u003e('values');\n\n  // Terminals\n  final $comma = Terminal(',');\n  final $eof = Terminal('end of file');\n  final $false = Terminal\u003cbool\u003e('false');\n  final $leadingSpaces = Terminal('leading spaces');\n  final $lbrace = Terminal('{');\n  final $lbracket = Terminal('[');\n  final $number = Terminal\u003cnum\u003e('number');\n  final $null = Terminal('null');\n  final $rbrace = Terminal('}');\n  final $rbracket = Terminal(']');\n  final $semicolon = Terminal(':');\n  final $string = Terminal\u003cString\u003e('string');\n  final $true = Terminal\u003cbool\u003e('true');\n\n  // Subterminals\n  final _char = Subterminal\u003cint\u003e('char');\n  final _escaped = Subterminal\u003cint\u003e('escaped');\n  final _hexdig = Subterminal\u003cint\u003e('hexdig');\n  final _hexdig4 = Subterminal\u003cint\u003e('hexdig4');\n  final _unescaped = Subterminal\u003cint\u003e('unescaped');\n  final _ws = Subterminal('ws');\n\n  // Nonterminals\n  array \u003c\u003c seqm([$lbracket], values.opt, [$rbracket]).map((r) =\u003e r ?? []);\n\n  json \u003c\u003c seqm([$leadingSpaces], value, [$eof]);\n\n  member \u003c\u003c\n      seqfl($string, [$semicolon], value).map((r) =\u003e MapEntry(r.$1, r.$2));\n\n  members \u003c\u003c repsep(member, $comma);\n\n  object \u003c\u003c\n      seqm([$lbrace], members.opt, [$rbrace])\n          .map((r) =\u003e {}..addEntries(r ?? []));\n\n  value \u003c\u003c object;\n  value \u003c\u003c array;\n  value \u003c\u003c $string;\n  value \u003c\u003c $number;\n  value \u003c\u003c $true;\n  value \u003c\u003c $false;\n  value \u003c\u003c $null;\n\n  values \u003c\u003c repsep(value, $comma);\n\n  // Terminals\n  $comma \u003c\u003c seq([literal(','), _ws]);\n\n  $eof \u003c\u003c not(any());\n\n  $false \u003c\u003c seqr([literal('false'), _ws], false);\n\n  $lbrace \u003c\u003c seq([literal('{'), _ws]);\n\n  $leadingSpaces \u003c\u003c _ws;\n\n  $lbracket \u003c\u003c seq([literal('['), _ws]);\n\n  $null \u003c\u003c seqr([literal('null'), _ws], null);\n\n  final zero = '0'.r;\n  final digit = '0-9'.r;\n  final minus = '-'.r;\n  final integer = alt\u003cdynamic\u003e([\n    zero,\n    seq(['1-9'.r, digit.star])\n  ]);\n  final frac = seq(['.'.r, digit.plus]);\n  final exp = seq(['eE'.r, '+-'.r.opt, digit.plus]);\n\n  $number \u003c\u003c\n      seqf(cap(seq([minus.opt, integer, frac.opt, exp.opt])), [_ws])\n          .map(parseNumber);\n\n  $rbrace \u003c\u003c seq([literal('}'), _ws]);\n\n  $rbracket \u003c\u003c seq([literal(']'), _ws]);\n\n  $semicolon \u003c\u003c seq([literal(':'), _ws]);\n\n  $string \u003c\u003c\n      seqm([literal('\"')], _char.star, [literal('\"'), _ws])\n          .map((r) =\u003e String.fromCharCodes(r));\n\n  $true \u003c\u003c seqr([literal('true'), _ws], true);\n\n  // Subterminals\n  _char \u003c\u003c _unescaped;\n  _char \u003c\u003c seql([r'\\\\'.r], _escaped);\n\n  _escaped \u003c\u003c r'\\u22\\u2f\\u5c'.r;\n  _escaped \u003c\u003c seqr(['b'.r], 0x08);\n  _escaped \u003c\u003c seqr(['f'.r], 0x0c);\n  _escaped \u003c\u003c seqr(['n'.r], 0x0a);\n  _escaped \u003c\u003c seqr(['r'.r], 0x0d);\n  _escaped \u003c\u003c seqr(['t'.r], 0x09);\n  _escaped \u003c\u003c seqr(['v'.r], 0x0b);\n  _escaped \u003c\u003c seql(['u'.r], _hexdig4).map((r) =\u003e r);\n\n  _hexdig \u003c\u003c 'a-f'.r.map((c) =\u003e c - 97);\n  _hexdig \u003c\u003c 'A-F'.r.map((c) =\u003e c - 65);\n  _hexdig \u003c\u003c '0-9'.r.map((c) =\u003e c - 48);\n\n  _hexdig4 \u003c\u003c\n      seq4(_hexdig, _hexdig, _hexdig, _hexdig)\n          .map((r) =\u003e r.$1 * 0xfff + r.$2 * 0xff + r.$3 * 0xf + r.$4);\n\n  _unescaped \u003c\u003c r'\\u20-\\u21\\u23-\\u5b\\u5d-\\u10ffff'.r;\n\n  _ws \u003c\u003c r' \\n\\r\\t'.r.star;\n\n  final builder = GrammarBuilder();\n  return builder.build(json);\n}\n\nParser\u003cE\u003e compileGrammar\u003cE\u003e(Grammar\u003cE\u003e grammar,\n    [GrammarCompilerOptions options = const GrammarCompilerOptions()]) {\n  final compiler = GrammarCompiler\u003cE\u003e(options);\n  return compiler.compile(grammar);\n}\n\n```\n\nTo be continued...","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsutton%2Fparser_tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbsutton%2Fparser_tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsutton%2Fparser_tool/lists"}