Coder Social home page Coder Social logo

terrario-js / terrario Goto Github PK

View Code? Open in Web Editor NEW
28.0 3.0 2.0 850 KB

A refined, expressive parser combinator library.

Home Page: https://terrario-js.github.io/

License: MIT License

TypeScript 84.77% JavaScript 15.23%
parser parser-combinators typescript javascript parsing zero-dependency parse parser-library scannerless esm

terrario's People

Contributors

marihachi avatar thinaticsystem avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

terrario's Issues

ドキュメント書く

  • APIリファレンス (英語)
    書けてきた

  • APIリファレンス (日本語)
    まだない

  • チュートリアル (英語)
    翻訳して追加した

  • チュートリアル (日本語)
    途中

中置演算をサポートする

特定のアプリケーションではあるけど、
比較的実装の難易度が高いのでサポートがあると便利かも

`Parser<T>.map` における `createParser` の利用はもっとシンプルにできそう

初めて issue 投げます、kodai です。

terrario 0.9.0 のライブラリ本体の定義コードを写経していて気づいたんですが、
Parser<T>.map の定義は

map<U>(fn: (value: T) => U): Parser<U> {
  return createParser((input, index, children, state) => {
    const result = children[0].exec(input, state, index);
    if (!result.success) {
      return result;
    }
    return success(result.index, fn(result.value));
  }, [this]);
}

ではなく

map<U>(fn: (value: T) => U): Parser<U> {
  return createParser((input, index, [], state) => {
    const result = this.exec(input, state, index); // <-- children[0] ではなく this に
    if (!result.success) {
      return result;
    }
    return success(result.index, fn(result.value));
  }); // <-- children を空に
}

のように children を空にして this を直接参照するほうが、
children として実際に何が渡されているのか確認するために視線を上下に動かしたり、
children を渡し忘れても静的型チェックが通ってバグることが防げて、素直で読みやすいと思いました。

アロー関数式内での this はレキシカルスコープなので、
パーサの呼び出し場所等で this の参照先が変わることはないはずです。

fork して同様の変更を適用してテストが通ることは確認済みです。
PR 投げることもできるので検討よろしくお願いしますm(_ _)m

ブランチ:https://github.com/0918nobita/terrario/tree/simplify-use-of-createParser

パッケージを分割する?

APIセットは現時点で2つある:

  • 文字列を入力として受け取るパーサーのAPIセット (string parsers API, 従来のもの)
  • トークン列を入力として受け取るパーサーのAPIセット (token parsers API)

これらを同時に使うことは少ないため、パッケージを別々にすることでインストールサイズを削減できる。

条件分岐API

API設計から検討する必要あり
現状では、とりあえず自分でParserのインスタンスを作れば状態を扱える(カスタムパーサー)。handlerの第3引数。

パース結果の見直し

パース失敗結果に以下の情報を含めたい:

  • 入力文字列の位置
  • 期待していたパーサー名のリスト

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.