構文を解析するプログラムをパーサと呼びます。実装方法にはいくつか種類がありますが、今回はパーサコンビネータという方式を取り上げます。既存の実装を使うのではなく、1から実装しながら説明します。 C++ではBoost.Spiritが有名ですが、この記事ではHaskellのParsecを参考にしています。もちろんHaskellやモナドの知識は前提としません。それと断らずにモナドに由来する何かは出て来ますが、それが見抜けなくても問題ありません。興味があれば以下の記事を参照してください。 Haskell 構文解析 超入門 2015.07.31 今回はラムダ式を多用するためC++11以降を対象とします。ラムダ式なしで実装するとあまりにも冗長になり過ぎて、便利さよりも煩雑さが勝ってしまうためです。興味があれば、以下のリポジトリを参照してください。 https://bitbucket.org/7shi/p
この記事では、基本ライブラリである Prelude の関数をだいたい理解した人が、次に知るべきライブラリを紹介します。自由自在にリストを使いこなせ、正規表現がなくてもプログラミングができるんだなと実感した人を対象にしています。 この記事のテーマは、脱リストです。リストはとても柔軟ですが、リストで表現されている文字列は、メモリーをたくさん消費しますし、なにより遅いのです。実用的なプログラムを書くためには、必要に応じて適切なデータ構造を使う必要があります。 containers containersは、文字通りコンテナ型をいくつか集めたパッケージです。ハッシュの代替品やキューとして使えます。連想リストを使っているところは、すべて Data.Map などで置き換えることをお勧めします。 containers に入っているモジュールはすべて眺めましょう。そして、実装も読んでみましょう。(プログラミ
Attoparsecを使っていてハマったところをいくつか by Yuji Yamamoto on January 5, 2014 Haskellでちょっとしたコマンドを作りました 自分専用のスクリプトとして、と考えていたのですが、 作っているうちにいろいろ技術的なことを共有したくなったので、 Githubで公開しました。 (とはいえ、あくまで自分用なのでhackageには上げません) 中身は単純で、cabal build vm-backup-snapshotしてから実行すると、 VirtualBox上で1作成した「Ubuntu」という名前のVMから、 一番古いスナップショットを削除したり、 名前に現在時刻を付けたスナップショットを作成したりできます。 (書いていて今更気づきましたが、いくら自分用とはいえ、 VMの名前ぐらいハードコードしないほうが良さそうですね…) 詳しくは main.hs
Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
kansaifp-01.md Attoparsecで簡単パージング 自己紹介 Fujiyan(@fujiyan18) Haskell始めて1年半です。 「すごいHaskell読書会 in 大阪 2週目」で勉強中です。 今日の資料、スライドに落とせませんでした…。 今回のポイント Haskellのパーザライブラリである、Attoparsecをご紹介致します。 パーザライブラリは、Haskellの面白さが比較的わかりやすく体験できるので、私のような初学者の方にオススメです。 今回は、Attoparsecの組み込みパーザの説明から、独自パーザの定義方法を経て、最後にCSVファイルをパーズする例を取り上げます。 BNFの定義からストレートに、パーザが記述できる様子を御覧ください。 Attoparsecとは Haskellのパーザライブラリです。 同様のパーザライブラリで有名なものとしてParsec
以下のプログラムは Tiny C のパーサをParsec ライブラリを使って書きかけたものである。 Tiny Cの構文を適切な代数的データ型として定義し、Tiny Cのパーサーを完成させよ。 (Tiny CのBNFはこのページの最後に示す。) 補足: パーサプリミティブの説明 tinyCStyleとlexerは、 C言語のトークンの定義(実際にはJava言語のものを流用)に合わせて、後述の whiteSpace〜reservedOpを用意するための補助的定義である。 whiteSpace〜reservedOpは、C言語のトークンをパースするための パーサ関数である。また、runLexはパーサをテストするための関数である。 これらは組み合わせて、例えば次のように使用する。 Parser> runLex (do {parseId; parseAddSub; parseId; return ()
※注意: この記事は古い記事です。import周り等、最新versionのparsecライブラリにし追随ていません。一応、2013年(7月10日)当時はこうだったという形で記録として残してあります。(追記: 2017/7/17) Haskellの勉強がてらParsecを使ってみました。 コードを眺めただけだと、再帰的下向き構文解析を手で書いているのとあまり変わらないように見えますが、実際に書いてみると非常に簡単ですね。モナド使ってるっていうのが、気に入りませんが。構文解析のコードしか書いてないのに、字句解析器もやってくれます。 次の文法をS式に書き直すパーサを書いてみました。中置記法を前置記法に変換します。LLパーサなので、左再帰しないように気を使います。 Infix → Exp Exp → Term "+" Exp | Term "-" Exp | Term Term → F
I’m pleased to introduce the third generation of my attoparsec parsing library. With a major change to its internals, it is both faster and more powerful than previous versions, while remaining backwards compatible. Comparing to C Let’s start with a speed comparison between the hand-written C code that powers Node.js’s HTTP parser and an idiomatic Haskell parser that uses attoparsec. There are goo
Big Sky :: プログラミング言語の作り方(2) Big Sky :: プログラミング言語の作り方(3) Big Sky :: プログラミング言語の作り方(4) Big Sky :: プログラミング言語の作り方(5) github の trending を見てたら面白い物を見つけた。 orangeduck/BuildYourOwnLisp - GitHub Learn C and build your own programming language in under 1000 lines of code! https://github.com/orangeduck/BuildYourOwnLisp 手順にそってC言語で lisp を実装する手順を見せるという物なのだが、その教材の一部としてパーサのコードが含まれている。 このパーサ部分だけ別のプロジェクトとして外出しされている。 o
このページにはいわゆる解説記事を載せるつもりは無かったのだが、 (たいていは他にもっとうまい説明のページがあるだろうから…) どうやらこれがそうなってしまいそうである。 もっとまともな解説は http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part2/Chap5.html こちらをどうぞ。(って人のページなんだけどな…) 概要 パーザコンビネータはプリミティブパーザと パーザ同士を組み合わせるコンビネータとからなる。 小さいパーザを組み立てて最終的なパーザを作り上げるのである。 パーザ パーザはいろいろなものが考えられるが、 ここでは単純に、文字列を引数にとり、 解析したもの+残りの文字列を返す関数であるとする。 type Parser a = String -> (a,String) Stringもパラメータ化すると
Interactive code snippets not yet available for SoH 2.0, see our Status of of School of Haskell 2.0 blog post IntroductionIn this tutorial you will learn how to parse log-like files and how to render a log to a file. Many applications use logs to keep track of some useful information to be analysed later on. Parsing a log-like file it is an easy parsing task in comparison with parsing, say, a prog
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く