项目作者: caffeine-suite

项目描述 :
CaffeineEight - parsing made as easy as humanly possible
高级语言: JavaScript
项目地址: git://github.com/caffeine-suite/caffeine-eight.git
创建时间: 2016-05-14T00:05:56Z
项目社区:https://github.com/caffeine-suite/caffeine-eight

开源协议:

下载


CaffeineEight Build Status

Come to C8 because you want an elegant, declarative API that makes parsing as easy as humanly possible. Stay for super powers like detailed parsing errors, predictable PEG-based parsing and runtime parser extendability.

Unlike other parsing libraries, CaffeineEight is not a parser-generator. There is no build step. Just extend a class, add some rules and you are ready to parse. With CaffeineEight you can create and, more importantly, extend your parsers at runtime.

Motivating Example

A complete JSON parser in less than 30 lines of code.

  1. # CaffeineScript
  2. class JsonParser extends &CaffeineEight.Parser
  3. @rule
  4. root: :array :object
  5. array:
  6. "'[' _? ']'"
  7. "'[' _? value commaValue* _? ']'"
  8. object:
  9. "'{' _? '}'"
  10. "'{' _? pair commaPair* _? '}'"
  11. commaValue: "_? ',' _? value"
  12. commaPair: "_? ',' _? pair"
  13. pair: "string _? ':' _? value"
  14. value: :object :array :number :string :true :false :null
  15. string: /"(?:[^"\\]|\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4}))*"/
  16. number: /-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/
  17. true: /true/
  18. false: /false/
  19. null: /null/
  20. _: /\ +/
  21. .repl()

Goals

  • Define PEG parsers 100% in JavaScript
  • Runtime-extensible parsers
  • Reasonably fast
  • No globals - each parser instance parses in its own space

Features

  • Full parsing expression grammar support with memoizing
  • Full JavaScript regular expressions support for terminals
  • Simple, convention-over-configuration parse-tree class structure
  • Human-readable parse-tree dumps
  • Detailed information about parsing failures
  • Custom sub-parser hooks
    • Which enable indention-based block parsing for languages like Python, CoffeeScript, or my own CaffeineScript

Learn More

Rename History

  • CaffeineEight was formally called BabelBridgeJs
  • CaffeineEight was inspired by my earlier Babel Bridge Ruby Gem, the JavaScript version turned out to be even more awesome!