タグ

yaccに関するmanabouのブックマーク (8)

  • 言語を作る!bisonとflexを使ってみた - Qiita

    授業でコンパイラの勉強をしたので試しにコンパイラ生成系(Compiler Compiler)を使ってみようと思います。 yaccとlexを使いたかったのですが、私のマシンがwindowsだったので同じようなものにbisonとflex があることが分かったので使ってみます。yaccがbisonでlexがflexのようです。 yaccとlexとは yaccは構文解析器を作るためのプログラムです。例えば、掛け算の式とは<数>'*'<数>はこんな形だと教えると解釈してくれるようなプログラムを作ってくれます。ずいぶん昔からあるようですが、いまでもRubyの処理系などで現役で活躍しているようです。 lexはyaccよりももっと低レベルな部分について解析する字句解析器を作ってくれるプログラムです。例えば、数は0-9の数字がいくつか並んだものであるとか、識別子は先頭がアルファベットで2文字目以降は数字かア

    言語を作る!bisonとflexを使ってみた - Qiita
  • プログラミング言語の作り方 - UUUMエンジニアブログ

    おはこんばんちは。 尾藤 a.k.a. BTOです。 普段我々開発者は、プログラミング言語を使ってシステムを開発しています。 しかし、プログラミング言語も人によって開発されたコンピュータプログラムです。 先日社内勉強会で、普段使っているプログラミング言語が、どういう仕組みで成り立っているのかを発表しました。 それで実際に簡単な四則演算を計算する簡単な電卓を実装してみました。 ソースコードを公開していますので、最初のとっかかりの参考程度にはなるかと思います。 github.com 正規文法・文脈自由文法 ノーム・チョムスキーという有名な言語学者が形式言語の生成文法を定式化しました(チョムスキー階層)。 彼は生成規則の制限の強さによって、階層を分けました。 制限は緩ければ緩いほど、言語としての表現力は上がりますが、解析は難しくなります。 このチョムスキー階層の中で、我々が慣れ親しんでいるのが、

    プログラミング言語の作り方 - UUUMエンジニアブログ
  • Golangでインタプリタ作ってみた - Qiita

    突然ですが、先日行われた学生向けのコンテストにおいてGolang製インタプリタ(Copal)で参戦しました。 当日の発表では、Gopher君でなんとか笑いを取ることが出来たので、Gopher君に感謝です。 質疑応答で色々と言われるかなと覚悟してましたが、無難な質問で助かりましたw。 後ほどTwitterを少し拝見すると「Golangのラッピング」じゃない?と思われた方もいました。 はい、そのとおりです。 開発期間がアレなんで、現状が精一杯でGolangと差別化する機能を搭載できませんでした。 あと、テストコード・ベンチマークも1行も書いてないという出来なので、正直恥ずかしいです。 (想定はしていましたが、質疑応答でここらへん聞かれなくてよかった…。) さて、前置きはここまでにして、Golang歴半年+αの私が大学のテスト期間の空き時間を使って2,3週間ほどで作ってみたインタプリタをちょっと

    Golangでインタプリタ作ってみた - Qiita
  • Yacc is dead: An update

    In examples, we'll still use juxtaposition to denote concatenation. The derivative for regular languages The useful property of the derivative from an implementation point of view is that it has a recursive definition over regular languages: Dc(∅) = ∅ Dc(ε) = ∅ Dc(c) = ε Dc(c') = ∅ if c is not c' Dc(A ○ B) = Dc(A) ○ B if A does not contain the empty string Dc(A ○ B) = Dc(A) ○ B ∪ Dc(B) if A contai

  • Parse::RecDescentでJSONをパース - はこべにっき ♨

    JSON::Hatchet の構文解析子 - Tociyuki::DiaryのJSONパーサがすっきりと書けていたのものだから,ちょっとうちもJSONパースしたくなってので書いてみました.といってもLL構文のパーサを1から書くのも芸がない感じだったので.Parse::RecDescentというCPANモジュールを使ってJSONのパーシングをしてみました. Parse::RecDescentはその名のとおり,汎用の再帰下降型パーサです.LL(1)文法にのっとっていれば,パースが可能です.*1 id:tociyukiさんがの記事にあるBNFを流用させてもらい,JSONのパーサを書くと以下のようになりました. このように,BNFっぽいものを記述するだけでパースを行うことができてお手軽です.パターンとして正規表現を書くこともできて,スキャナーに相当することもやってくれてます. 構文規則に合わせてパ

    Parse::RecDescentでJSONをパース - はこべにっき ♨
  • 第9章 速習yacc

    概要 パーサとスキャナ プログラム言語のパーサの書きかたは昔からしつこく研究されてきており、 かなりしっかりした定石がある。よほど変な(または曖昧な)文法でない 限り、定石にのっていけば解決できるものだ。 まず最底辺には文字列を単語(トークンとも言う)の列に切り出す部 分がある。これをスキャナ(scanner)とかレクサ(lexer)と言 う。日語で言うと字句解析器だが、言いにくいのでスキャナと呼ぼう。 スキャナというものが出てくる根底にはそもそも「単語の区切りには空白ある でしょ」という常識がある。そして実際にたいていのプログラミング 言語はそういう仕様になっている。そのほうが楽だからだ。 例えば古いFortranでは空白が意味を持たなかった。つまり空白を入れても 単語区切りとは限らないし、変数の途中で何の前触れもなく空白を挿入したり することもできた。ところが解析が恐ろしく面倒なもの

  • Parse::Yapp ヨチヨチ歩き - 日向夏特殊応援部隊

    Perlのyacc風パーサーである Parse::Yapp でちょっと遊んでみてます。 とにかく書き方に関する解説とか全然オンラインでヒットしないので、少し分かってきたので、個人的にまとめてみます。門外漢なので突っ込み歓迎。 お題 IPv4なアドレスをパースします。 ってもこれなら正規表現だけで瞬殺なんだけど、ヨチヨチ歩き版なので許して下さい。 ypファイル %{ use strict; use warnings; use Data::Dump qw(dump); %} %% ipv4 : dec_octet '.' dec_octet '.' dec_octet '.' dec_octet { my ($self, @patterns) = @_; return [ grep { $_ ne '.' } @patterns ]; } ; dec_octet : DIGIT | DIGIT

    Parse::Yapp ヨチヨチ歩き - 日向夏特殊応援部隊
  • JSONParserWithParseYapp - mizzy.org - Trac

    構文解析をちゃんと学ばないとなー、と前々から思いつつしばらく放置だったけど、なんとなくやる気になったのでやってみる。 ZIGOROu さんの Parse::Yapp ヨチヨチ歩き で Parse::Yapp の使い方を学びつつ、Rubyソースコード完全解説 第9章 速習yacc でパーサの書き方の基礎がなんとなくわかった気になり、でも実際は自分で書いてみなきゃわからん、ってことで、hakobe さんの Parse::RecDescentでJSONをパース を参考に、Parse::Yapp で JSON パーサを書いてみることにした。 といっても、いきなり全部書くと訳わかんないことになるので、まずは配列から。しかも数値のみ。(2011/02/16 追記。文字列も対応。) パーサ+スキャナは以下のような感じ。 %{ use strict; use warnings; %} %% JSON :

  • 1