August
16

Parsimmon のREADME.mdを翻訳しました。

許可はきちんととりました。Can I write article about README.md of parsimmon in Japanese? #44

Copyright (c) 2011-present J. Adkisson (http://jneen.net). LICENSE: MIT

Parsimmon

Parsimmon(by @jneen and @laughinghan)

Parsimmonは小さいパーサーで作られた大きいパーサーを書くための小さいライブラリです。APIはparsecとPromises/Aにインスパイアされました。

Quick Example

var regex = Parsimmon.regex;
var string = Parsimmon.string;
var optWhitespace = Parsimmon.optWhitespace;
var lazy = Parsimmon.lazy;

function lexeme(p) { return p.skip(optWhitespace); }

var lparen = lexeme(string('('));
var rparen = lexeme(string(')'));

var expr = lazy('an s-expression', function() { return form.or(atom) });

var number = lexeme(regex(/[0-9]+/).map(parseInt));
var id = lexeme(regex(/[a-z_]\w*/i));

var atom = number.or(id);
var form = lparen.then(expr.many()).skip(rparen);

expr.parse('3').value // => 3
expr.parse('(add (mul 10 (add 3 4)) (add 7 8))').value
  // => ['add', ['mul', 10, ['add', 3, 4]], ['add', 7, 8]]

Explanation

Parsimmonのパーサーはテキストのストリームへのアクションと、そのアクションが成功した際に返すオブジェクトもしくは失敗した際のメッセージの挙動を表したオブジェクトです。 例えば string('foo') は 'foo' という文字列をもしストリームの正当が'foo'の時に返し、そうでないとき失敗を返します。

コンビネーターのメソッドの .map を使うとパーサーが返す値を変えることができます。例えば、

string('foo').map(function(x) { return x + 'bar'; })

はストリームが'foo'で始まる時に 'foobar' を返します。

digits.map(function(x) { return parseInt(x) * 2; })

は'12'という文字列が出てきた際に 24 という数値を返します。 .result メソッドは定数をパーサの返す値とすることができます。

パーサの .parser(str) メソッドを呼び出すとその文字列をパースし、statusというプロパティを持ったオブジェクトを返します。statusはパースが成功したかどうかを表します。成功した場合、valueプロパティにパースした結果が入ります。成功しなかった場合、indexとexpectedプロパティにパースエラーの位置と何がパース対象として想定されていたのか示すメッセージが入っています。エラーオブジェクトをパース元の文字列と共に Parsimmon.formatError(source, error) に渡すとhuman-readableなエラーオブジェクトを得ることができます。

Full API

Included parsers / parser generators:

  • `Parsimmon.string("my-string")` は"my-string"を期待し、"my-string"を返すパーサです。
  • `Parsimmon.regex(/myregex/, group=0)` はストリームが与えられた正規表現にマッチすることを期待し、マッチしたグループのうちgroupで渡されたグループもしくはすべてのマッチした部分を返すパーサです。
  • `Parsimmon.succeed(result)` は文字列を何も消費せず `result` を返すパーサです(訳者注:文字列を消費するというのは、ストリームの現在まで読み込んだ位置を進めることです)。
  • `Parsimmon.seq(p1, p2, ... pn)` はいくつでもパーサを受け取ることができ、受け取ったパーサが順に現れると期待するパーサです。受け取ったパーサのそれぞれの結果の配列を返します。
  • `Parsimmon.alt(p1, p2, ... pn)` はいくつでもパーサを受け取ることができ、受け取ったパーサの中で最初に成功したパーサの結果を返し、中間の結果は破棄されます。
  • `Parsimmon.sepBy(content, separator)` は2つのパーサを受け取り、複数の `separator` に区切られた `content` を期待し、 `content` の配列を返します。
  • `Parsimmon.sepBy1(content, separator)` は `Parsimmon.sepBy`と同様ですが、 `content` が少なくとも1つあることを期待します。
  • `Parsimmon.lazy(f)` はパーサを返す関数を受け取ります。受け取ったパーサはパーサが使われて初めて評価されます。これはまだ定義されていないパーサを参照する際に便利です。
  • `Parsimmon.lazy(desc, f)` は `Parsimmon.lazy` と同様ですが、期待された値に `desc` をセットします(下の `.desc()` も参照ください)。
  • `Parsimmon.fail(message)`
  • `Parsimmon.letter` は `Parsimmon.regex(/[a-z]/i)` と同等です。
  • `Parsimmon.letters` は `Parsimmon.regex(/[a-z]\*/i)` と同等です。
  • `Parsimmon.digit` は `Parsimmon.regex(/[0-9]/)` と同等です。
  • `Parsimmon.digits` は `Parsimmon.regex(/[0-9]\*/)` と同等です。
  • `Parsimmon.whitespace` は `Parsimmon.regex(/\s+/)` と同等です。
  • `Parsimmon.optWhitespace` は `Parsimmon.regex(/\s\*/)` と同等です。
  • `Parsimmon.any` はストリームの文字列を1つ消費し返します。
  • `Parsimmon.all` はストリームの残り全ての文字列を消費し返します。
  • `Parsimmon.eof` はストリームの終わりを期待します。
  • `Parsimmon.index` はパースしている現在地点のインデックスを返します。
  • `Parsimmon.test(pred)` は述部をパスした時にストリームの現在の文字を返します(訳者注:述部とはここではpred引数に渡された関数のことです)。
  • `Parsimmon.takeWhile(pred)` は現在地点から述部がパスしなくなるまでストリームを消費し返します。

Adding base parsers

`Parsimmon.custom` を使うことで新しいパーサ(含まれているパーサに類似している)を追加することができます。

function notChar(char) {
  return Parsimmon.custom(function(success, failure) {
    return function(stream, i) {
      if (stream.charAt(i) !== char && stream.length <= i) {
        return success(i+1, stream.charAt(i));
      }
      return failure(i, 'anything different than "' + char + '"');
    }
  });
}

このパーサは次のように今ある全てのパーサと同じように使い構成することができます。

var parser = seq(string('a'), notChar('b').times(5));
parser.parse('accccc');

Parser methods

  • `parser.or(otherParser)`: は `parser` を試し、失敗したら `otherParser` を試す新しいパーサを返します。
  • `parser.chain(function(result) { return anotherParser; })`:は `parser` を試し、成功した時に与えられた関数をパース結果と共に呼び出す新しいパーサを返します。与えられた関数は次に試される新しいパーサを返します。 `parser.chain` を使うことで他のコンビネータにはできない、直接どのようにパースを続けるかを決めることができるようになります。
  • `parser.then(anotherParser)`: は `anotherParser` が `parser` に続いて現れると期待し、 `anotherParser` の結果を返します。注意: `parser` の結果はここでは無視されます。
  • `parser.map(function(result) { return anotherResult; })`: は `parser` の結果を与えられた関数で変更します。
  • `parser.skip(otherParser)` は `otherParser` が `parser` の後ろにあると期待しますが、 `parser` の結果を返します(訳者注:つまり、otherParserの分ストリームを進めますが後は `parser` と同様に動作するということです)。
  • `parser.result(aResult)`: は全く同じ動作をするが、 `aResult` を返すという新しいパーサを返します。
  • `parser.many()`: は `parser` が0回以上続くことを期待し、結果の配列を返します。
  • `parser.times(n)`: は `parser` がちょうど `n` 回繰り返されることを期待し、結果の配列を返します。
  • `parser.times(min, max)`: は `parser` が `min` 回から `max` 回繰り返されることを期待し、結果の配列を返します。
  • `parser.atMost(n)`: は `parser` が多くとも `n` 回繰り返されることを期待し、結果の配列を返します。
  • `parser.atLeast(n)`: は `parser` が少なくとも `n` 回繰り返されることを期待し、結果の配列を返します。
  • `parser.mark()` は `start` 、 `value` 、 `end` キーを持ったオブジェクトを返します。`value` はパーサに返された元の値、`start` と `end` はパースされたテキストのストリーム中の位置を示す値です。
  • `parser.desc(description)` は失敗した時のメッセージが渡された description である新しいパーサを返します。例えば `string('x').desc('the letter x')` は 'the letter x' が期待されていた、と失敗した時に示します。

Tips and patterns

これらは伝統的な言語のほとんどのパーサに適応できます。それは何か別のことをあなたのパーサにする必要がある時にも可能です。

ほとんどのパーサにとって次のフォーマットは有用です。

  1. `lexeme` 関数をパーサで無視したいもの(ホワイトスペース、コメントなど)全てをスキップするために定義します。多様なタイプのlexemeが必要になるでしょう。例を上げると次のようになります。
    var ignore = whitespace.or(comment.many());
    function lexeme(p) { return p.skip(ignore); }
  2. 全ての語彙素となるパーサをはじめに定義します(訳者注: 語彙素とは最も小さいパーツとなるパーサのことです)。これらのパーサはネイティブJavaScriptの値を返します。
    var lparen = lexeme(string('('));
    var rparen = lexeme(string(')'));
    var number = lexeme(regex(/[0-9]+/)).map(parseInt);
  3. トップレベルのパーサを1つ以上 `lazy` を使い先に宣言します。このパーサはまだ定義されていないパーサを参照します。一般的にこのパーサは引数を多く受け取る `.alt()` の呼び出しという形を取ります。
    var expr = lazy('an expression', function() { return Parsimmon.alt(p1, p2, ...); });
  4. そしてパーサを裏の裏まで作ります。これらのパーサは AST ノードもしくは他のあなたの構成したい言語特有のオブジェクトを返します。
    var p1 = ...
    var p2 = ...
  5. 最後に、トップレベルのパーサをエクスポートします。はじめに無視すべきものを無視することを忘れないで下さい。
    return ignore.then(expr.many());
  6. Fantasyland

    Parsimmon はまた、fantasylandと互換性があります。ParsimmonはSemigroup、Applicative Functor、そしてMonadです。

Comments
I was just looking at your Parsimmon のREADME.mdを翻訳しました。: PandaNoir website and see that your site has the potential to get a lot of visitors. I just want to tell you, In case you didn't already know... There is a website service which already has more than 16 million users, and most of the users are looking for websites like yours. By getting your site on this service you have a chance to get your site more visitors than you can imagine. It is free to sign up and you can read more about it here: http://jawaidali.com/redirectURL/5d - Now, let me ask you... Do you need your site to be successful to maintain your way of life? Do you need targeted traffic who are interested in the services and products you offer? Are looking for exposure, to increase sales, and to quickly develop awareness for your website? If your answer is YES, you can achieve these things only if you get your website on the service I am describing. This traffic network advertises you to thousands, while also giving you a chance to test the network before paying anything. All the popular blogs are using this network to boost their readership and ad revenue! Why aren’t you? And what is better than traffic? It’s recurring traffic! That's how running a successful website works... Here's to your success! Find out more here: http://bbqr.me/4fx6
Samantha at 2016/01/30/ 17:19
I was just looking at your Parsimmon のREADME.mdを翻訳しました。: PandaNoir site and see that your site has the potential to get a lot of visitors. I just want to tell you, In case you didn't already know... There is a website service which already has more than 16 million users, and most of the users are interested in websites like yours. By getting your site on this service you have a chance to get your site more visitors than you can imagine. It is free to sign up and you can read more about it here: http://www.arvut.org/1/doX - Now, let me ask you... Do you need your site to be successful to maintain your way of life? Do you need targeted visitors who are interested in the services and products you offer? Are looking for exposure, to increase sales, and to quickly develop awareness for your site? If your answer is YES, you can achieve these things only if you get your site on the service I am describing. This traffic network advertises you to thousands, while also giving you a chance to test the network before paying anything. All the popular websites are using this service to boost their readership and ad revenue! Why aren’t you? And what is better than traffic? It’s recurring traffic! That's how running a successful website works... Here's to your success! Read more here: http://s.t0m-s.be/3A
Samantha at 2016/03/08/ 18:59
I was just looking at your Parsimmon のREADME.mdを翻訳しました。: PandaNoir site and see that your site has the potential to get a lot of visitors. I just want to tell you, In case you didn't already know... There is a website network which already has more than 16 million users, and the majority of the users are interested in websites like yours. By getting your website on this network you have a chance to get your site more visitors than you can imagine. It is free to sign up and you can find out more about it here: http://sirrico.net/yourls/p5sk - Now, let me ask you... Do you need your website to be successful to maintain your way of life? Do you need targeted visitors who are interested in the services and products you offer? Are looking for exposure, to increase sales, and to quickly develop awareness for your site? If your answer is YES, you can achieve these things only if you get your website on the service I am describing. This traffic service advertises you to thousands, while also giving you a chance to test the service before paying anything. All the popular blogs are using this network to boost their traffic and ad revenue! Why aren’t you? And what is better than traffic? It’s recurring traffic! That's how running a successful website works... Here's to your success! Read more here: http://sirrico.net/yourls/p5sk
Natalie at 2016/04/08/ 21:28
日本超人気スーパーコピーブランド時計激安通販専門店
2016年最高品質時計コピー、国際ブランド腕時計コピー、
業界唯一無二.世界一流の高品質ブランドコピー時計。
ロレックス 偽物 電池交換 http://www.newkakaku.com/xinq6.htm
ロレックス 偽物 電池交換 at 2016/11/20/ 21:39
最高品質 スーパーコピー N級品 全国送料無料

消費税無し! 送料無料! 手数料無料!
業務内容: 各種海外有名ブランド品を豊富に取り揃え、
しかもお客様を第一と考えて、驚きの低価格で提供しております

■ スタイルが多い、品質がよい、価格が低い!
■ 送料無料(日本全国) ご注文を期待しています!
■ 信用第一、良い品質、低価格は
■ 当社の商品は絶対の自信が御座います。

激安、安心、安全にお届けします.品数豊富な商
商品数も大幅に増え、品質も大自信です
100%品質保証!満足保障!リピーター率100%!

ホームページ上でのご注文は24時間受け付けております
カルティエ 結婚指輪 3色 編み方 http://watchkopi.com/protype/list-207.html
カルティエ 結婚指輪 3色 編み方 at 2017/01/26/ 23:46
株式会社 スーパーコピーブランド激安市場

ブランドコピー、ロレックスコピー、オメガコピー、ウブロコピー、ルイヴィトンコピー、シャネルコピー、グッチコピー、
スーパーコピーなどです。バッグ、財布、キーケース、時計、ジュエリー、マフラー、ストール、靴下、小件などあります
1.当社の目標は最高のインターネットサービスご提供することです.弊社は24時間営業、年中無休.
2.品質を重視、納期も厳守、信用第一は当社の方針です.
3.日本には無い商品,日本では高価な商品,弊社のない商品,取引先を代理して製造会社を連絡することができる.
4.弊社長年の豊富な経験と実績があり.輸入手続も一切は弊社におまかせできます.ご希望の商品を責任を持ってお届けします

是非ご覧ください!

休業日: 365天受付年中無休
ブライトリング モンブリラン 01 http://kopii.net/products/p1/1/2/index.htm
ブライトリング モンブリラン 01 at 2017/01/26/ 23:47
I was just looking at your Parsimmon のREADME.mdを翻訳しました。: PandaNoir website and see that your website has the potential to become very popular. I just want to tell you, In case you don't already know... There is a website network which already has more than 16 million users, and most of the users are looking for topics like yours. By getting your website on this network you have a chance to get your site more popular than you can imagine. It is free to sign up and you can find out more about it here: http://www.xeeter.com/37add - Now, let me ask you... Do you need your site to be successful to maintain your way of life? Do you need targeted traffic who are interested in the services and products you offer? Are looking for exposure, to increase sales, and to quickly develop awareness for your site? If your answer is YES, you can achieve these things only if you get your website on the service I am talking about. This traffic service advertises you to thousands, while also giving you a chance to test the service before paying anything. All the popular websites are using this network to boost their traffic and ad revenue! Why aren’t you? And what is better than traffic? It’s recurring traffic! That's how running a successful website works... Here's to your success! Read more here: http://acortarurl.es/5i
Sabrina Warren at 2017/02/21/ 13:46
Hi my name is Sarah Ballard and I just wanted to drop you a quick message here instead of calling you. I discovered your Parsimmon のREADME.mdを翻訳しました。: PandaNoir website and noticed you could have a lot more traffic. I have found that the key to running a popular website is making sure the visitors you are getting are interested in your website topic. There is a company that you can get keyword targeted visitors from and they let you try their service for free for 7 days. I managed to get over 300 targeted visitors to day to my site. https://z0p.org/4ccs
Sarah Ballard at 2017/03/23/ 17:23
Hi my name is Tami Sandoval and I just wanted to send you a quick message here instead of calling you. I came to your Parsimmon のREADME.mdを翻訳しました。: PandaNoir website and noticed you could have a lot more hits. I have found that the key to running a successful website is making sure the visitors you are getting are interested in your subject matter. There is a company that you can get keyword targeted traffic from and they let you try their service for free for 7 days. I managed to get over 300 targeted visitors to day to my site. http://www.axurl.com/5i
Tami Sandoval at 2017/03/28/ 09:14

Leave a Reply

Name *

Mail

URL

Comment *

トラックバック URL

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。