Haskell で parser を書くには (初心者編) 勝手に Haskell Advent Calendar 2011 Haskell Advent Calendar 2011 にはエントリーできませんでしたけど、一人寂しく「勝手に Haskell Advent Calendar 2011」を開催して、わくわくクリスマスを待ちたいと思います。 目的: Parsec3 と attoparsec の基本的使用法, Applicative スタイルを習得する 前置き: Haskell で parser を書くにはどうすればいいのでしょうか? 私は、これを勉強すべく情報源を探しましたが、一体どこからどう始めればいいのか分からず、非常に混乱しました。「この記事を読めば大体概要が全部分かる」という情報源が日本語でも英語でも見つけられなかったからです。なので自分でまとめてみることにしました。 (私
LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。Perl、Python、Ruby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事で二点ほど補足します。 Haskell では文法がうまく設計されており、コードを書けば自然とDSLっぽくなるので、わざわざ内部DSLなんて言わない。それよりもコンビネータという考え方を学ぶ方が新しい視野がひらけてよい。 Haskell ではパーサーを作るのが簡単。だから自分で言語を作るのも簡単。その言語を外部ファイルから読み込んでもいいし、HERE DOCUMENT のように内部に貼付けることもできる。 関数を二項演算子として扱う Haskell では関数をバッククォートで囲むと二項演算子になります。 i
> Haskell Brainfuck の検索結果 約 56,600 件中 1 - 10 件目 (0.16 秒) …まあ気にしない。もう書いちゃったし。 BF的な仕様入力が無くなった場合はポインタの指す値を変更しないmod 256 処理系の仕様入出力はIntのリストで遅延評価 使い方interpretBF "コード" [入力...] → [出力...] [3] *Main> interpretBF ",.,.,." [1,2,3] [1,2,3] *Main> take 10 $ interpretBF "+[.+]" [1,2,3] [1,2,3,4,5,6,7,8,9,10] *Main> interpretBF "<<<" [1,2,3] [] *Main> interpretBF "<<<." [1,2,3] [*** Exception: Prelude.(!!): negati
ふと思い立って Haskell で brainfuck を書いてみた。そんな事やってる人は沢山いると思うので、一つ制限をつけた。モナドは main 関数の中だけしか使わない。つまり、後は全部副作用なしでやる。 それから、大体の方針を立てた。brainfuck の文法はとても単純なので、もしかしてパーサすらいらないんじゃ無いかと思ったのだけど、ループがある関係上やっぱり最初に構文木を作ったほうがやりやすい。という事でオーソドックスに、ソースコード -> 構文木 -> 実行、と言う順序で進める事にした。 -- Parser data Command = Inc | Dec | Next | Prev | Put | Get | While [Command] deriving (Show, Eq) type Program = [Command] parse :: String -> Prog
Centre for LanguageTechnology Chalmers University ofTechnology and University ofGothenburg What is the BNF Converter? The BNF Converter is a compiler construction tool generating a compiler front-end from a Labelled BNF grammar.It is currently generating code for the target languages Haskell, Agda, C,C++,Java, and OCaml, as well as XML representations and Pygment syntax highlighters. Given a
始める前に とりあえず、まずはANTLRとはどんなものか使ってみましょう。 ANTLR のページからダウンロードします。 今回は、現在(2006/07/18)の安定最新版である 2.7.6 を使うことにしました。 ANTLRのようなツールを使うときに、最低限知っておく必要のある事があります。 それは正規表現です。 これを知っていないと、正直ANTLRを使うのは厳しいです。 基本的なところだけ知っていれば充分ですので、 まずは正規表現を学んでおきましょう。 簡単な例 ANTLRでは、一つのパーサを作成するのに Parser / Lexer を対で使います。 今回はAntlrのサイトに習って(パクって?)、数値演算式を解析するパーサを作成します。 まず、以下の内容をファイルに保存します。 expr.g class ExprParser extends Parser; expr: mexpr (
16:46 08/03/30 YZ1.DLL 0.30 リリース しました。 具体的には、ヘッダの格納ファイル数フィールドに実際より大きい値が入ってると変なとこ読もうとして落ちるバグ修正。GreenPad の修正は来週くらいには…。 Booooooost Boost 1.35.0 来てました。 Asio と Fusion と GIL の三枚看板がでかいですが、Bimap が地味に便利だ。 あと、mbさんのEgg のレビューが明日からでしょうか。(また スケジュール から消えてますが…Protoが入る前までロールバックしてる?) 他人事ながらドキドキ。 17:36 08/03/28 ケース 十年来の疑問なんですが、"case" に単独で対応する日本語ってなんになるんですかね。 "case-insensitive" や "lowercase" の "case"。単に "case-insens
3/2(日)の生駒読書会#2に向けて、Schemeのパーサを準備しておこうと思って作ってみました。なんちゃってSchemeで遊ぶくらいなので、機能はまだまだ足りません。R5RSと見比べると足りないのはだいたいこんな感じかな。 ペア。 文字。 n進数。小数。複素数。 quote。 ベクタ。 マクロ関係。 文字列の中の"。 ファイル: list_parser.y # Local Variables: # mode:ruby # compile-command: "racc -o list_parser.rb list_parser.y" # End: class ListParser rule atoms : | atom atoms { result = List.new(*val) } atom : IDENT | BOOLEAN | NUMBER | STRING | list lis
自社利用の知見・経験を顧客に提供 コンテナ活用を推進する日立製作所 VMware Tanzuを利用したモダナイズを伝授 オープンソース活用はあたりまえ! そんな今だからこそ改めて考える 企業ITにおけるOSS活用のメリットとリスク 特集:セキュリティトレンド-秋- つながる世界で問われる対応 サプライチェーンセキュリティを考える さあ、その想いをカタチにしよう。Google Cloud が企業の未来に向けた生産性 向上とコラボレーション実現のヒントを解説 サーバースペシャリストへの道PCサポートとサーバ管理の共通項 ひとり情シスのためのスキル向上のコツ ビジネスの推進には必須! ZDNet×マイクロソフトが贈る特別企画 今、必要な戦略的セキュリティとガバナンス EDRトップランナー対談:後編セキュリティ戦略を転換せざる得ない背景と EDRのような手法が必要な理由に迫るIT部門のDX
1リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く