タグ

parserとyaccに関するmanabouのブックマーク (5)

  • プログラミング言語の作り方 - UUUMエンジニアブログ

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

    プログラミング言語の作り方 - UUUMエンジニアブログ
  • 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