概要 パーサとスキャナ プログラム言語のパーサの書きかたは昔からしつこく研究されてきており、 かなりしっかりした定石がある。よほど変な(または曖昧な)文法でない 限り、定石にのっていけば解決できるものだ。 まず最底辺には文字列を単語(トークンとも言う)の列に切り出す部 分がある。これをスキャナ(scanner)とかレクサ(lexer)と言 う。日本語で言うと字句解析器だが、言いにくいのでスキャナと呼ぼう。 スキャナというものが出てくる根底にはそもそも「単語の区切りには空白ある でしょ」という常識がある。そして実際にたいていのプログラミング 言語はそういう仕様になっている。そのほうが楽だからだ。 例えば古いFortranでは空白が意味を持たなかった。つまり空白を入れても 単語区切りとは限らないし、変数の途中で何の前触れもなく空白を挿入したり することもできた。ところが解析が恐ろしく面倒なもの
We present two novel approaches to parsing context-free languages. The first approach is based on an extension of Brzozowski's derivative from regular expressions to context-free grammars. The second approach is based on a generalization of the derivative to parser combinators. The payoff of these techniques is a small (less than 250 lines of code), easy-to-implement parsing library capable of par
まつもとさん自身によるStreemについての解説は、今後日経Linuxで順次掲載されるようです。まつもとさんがStreemについて解説する内容は、おそらく、プログラミング言語設計に関する高レベルなものとなるのではないでしょうか。 本記事はそれとは無関係に、2015年1月に公開されているStreemについての低レベルな解説、つまり現時点のStreemのソースファイル(の一部)の読み解き方を示します。具体的には、GitHubのStreemリポジトリにある「lex.l」と「parse.y」という2つのソースファイルについて解説します。 Streemのソースファイルは、https://github.com/matz/streemからダウンロードできます。画面右下にある[Download ZIP]ボタンをクリックしてください。 lex.lとparse.y ダウンロードしたStreemソースファイルの
Go 言語による有理数電卓 2013-02-15 (鈴) 1. はじめに 2. トークンの取り出し 3. 再帰下降法による式の解釈と評価 4. 有理数の表示 5. おわりに src/calc/calc.go: 有理数電卓プログラム calc-25-02-13.tar.bz2: ソース一式: 5454 バイト 1. はじめに Go 言語は UTF-8 テキストに対する字句解析器を標準パッケージ "text/scanner" (scanner - The Go Programming Language [golang.org]) で用意している。 この字句解析器が認識する文字列リテラルや数値リテラルの形式は Go 言語の文法にしたがったものに限られるが,それらは今日普及している慣習に沿っており,さらに + や * などの記号については文字コードがそのまま返され,if や for などの単語につ
Go 言語による簡単な Lisp 2013-04-04 (鈴) 1. はじめに 2. 字句解析 3. 構文解析 4. 環境と評価器 5. おわりに tiny-lisp.go: 主手続き src/lisp/data.go: cons セルとシンボルその他 src/lisp/env.go: 環境と評価器 src/lisp/globals.go: トップレベルの環境 src/lisp/interp.go: ファイルや文字列を入力とするインタープリタ src/lisp/lex.go: 字句解析および構文解析 8queens.l: 8クイーン問題のプログラム例 (Let Little Lambda Lisp be a Little Lazy §7 から再掲) README.txt lisp-25-04-01.tar.bz2: ソース一式: 11728 バイト 1. はじめに Go 言語による有理数電
この記事は Go その 3 Advent Calendar 2015 の 22 日目の記事です。 go tool の中には yacc というコマンドがあります。これはパーサジェネレータである yacc の Go 言語版です。この記事ではこれをつかって簡単な jq のクエリパーサっぽいものを作ってみようと思います。 (この記事のコードは https://github.com/zoncoen-sample/goyacc-jq-query-parser にあります。あとこの記事で話してるものを使って雑に作った jq like TOML processor が https://github.com/zoncoen/tq に上がってます。) ご存知の方も多いかと思いますが一応簡単に紹介しておくと、 jq は標準入力から受けとった JSON 文字列から値を取り出したり加工したりする事ができるコマンドラ
go toolにはyaccというものがある。 これはunixの言語処理系で広く使われるyaccというパーサジェネレータのGoバージョンである。 本稿はその使い方を説明するチュートリアルである。 対象読者 goyaccを使う - Qiitaという記事があって、これはgoのyaccを使って簡単な言語の構文解析をして使い方を説明している。 しかし、yaccについての基本的な説明が完全ではなく(例えば%%とか)、yaccを触ったことがない人には若干難しい。 従って、私のようなGoの文法は理解しているがyaccを使ったことがない人向けにごく簡単な使い方を説明する。 参考資料 yacc - The Go Programming Languageが公式のドキュメントっぽいが、これもyaccの文法自体は他に任せている。 RHGの速習yaccがとても参考になると思う。 本稿はあくまで取っ付き易いチュートリア
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く