ymmtmdkのブックマーク (602)

  • 第9章 速習yacc

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

    ymmtmdk
    ymmtmdk 2018/11/05
  • 構文解析のオハナシを少し - 檜山正幸のキマイラ飼育記 (はてなBlog)

    工作員お手伝いのショー君がid:aiue3という投げやりなIDでダイアリーを書いていたようです。http://d.hatena.ne.jp/aiue3/20061120#1164006565 のなかに再帰的下向き法(recursive decent; 再帰下降法)というのが出てくるので少し補足しておきましょう。 お馴染みの算術式(arithmetic expression)を素材にします。'+'は足し算, '*'は掛け算、そして'-'は引き算ではなくて符号反転の単項演算子とします。 式 ::= 数 | 和 | 積 | 符号反転 | '(' 式 ')' 和 ::= 式 '+' 式 積 ::= 式 '*' 式 符号反転 ::= '-' 式 これでも、構文的に正しい算術式を定義できます。しかし、3 + 5 * 2 が (3 + 5) * 2 なのか 3 + (5 * 2) なのかはわかりません。

    構文解析のオハナシを少し - 檜山正幸のキマイラ飼育記 (はてなBlog)
    ymmtmdk
    ymmtmdk 2018/11/05
  • 手書きLLパーサにおける左結合性を持つ演算子の左再帰をループで解決する - ふるつき

    まあ人間が弱いと、構文解析は再帰を書き下すしかできないんですが、ナイーブな実装だと左再帰問題に出会います( A->A+B みたいなルールをコードに落とし込むと、 parseA の呼び出しで無限再帰になる)。右結合性の演算子のパースならぽいっとできるんですが、左結合の演算子だと苦戦しました。いろいろグーグルしてみるんだけど気持ちが上がらないとちゃんと読まないし、私が読めるコードが欲しい気持ちになったので書き残しておきます。n回ここに来るんだろうなぁ。 ちなみに a + b + c が (+ (+ a b) c) になるのが左結合性、 (+ a (+ b c)) になるのが右結合性です。 gist.github.com なんということは無くて、ただのループです。こんなのは知ってるかどうかという気持ちになってきた。 ちなみに明らかに parseAdd と parseMul が同じ形をしているので

    手書きLLパーサにおける左結合性を持つ演算子の左再帰をループで解決する - ふるつき
    ymmtmdk
    ymmtmdk 2018/11/05
  • 数式の再帰的下向き構文解析

    構文解析を行う際、世の中にはyaccのように生成規則から構文解析器を生成してもらえるツールが数多くあります。しかしそういったツールを使うまでは無いけど、自分でさっと作りたいなと思うときがあり、最近でいうとHaskellのQuasiQuotes周りでそういった場面がありました。 自分で書くのであれば、再帰的下向き構文解析がやりやすいだろうというのが通説のようなので、その背景と実装方法についてまとめてみます。 1. 再帰的下向き構文解析 再帰的下向き構文解析に関する概要を箇条書きでまとめました。 文脈自由文法に対する構文解析法の一つ 下向き -> 構文木を考えたときに、root側からleafへと解析が進む 出現するtokenと構文規則を元に何を解析するのか予想しながら下へ進む 予想する、という表現を最初見たときに少ししっくりこなかったが、それは恐らくLL(k)で考えているため LL(k)文法で

    ymmtmdk
    ymmtmdk 2018/11/05
  • 低レイヤを知りたい人のための Cコンパイラ作成入門

    はじめに このオンラインブックは執筆中です。完成版ではありません。フィードバックフォーム このには一冊のに盛り込むにはやや欲張りな内容を詰め込みました。書では、C言語で書かれたソースコードをアセンブリ言語に変換するプログラム、つまりCコンパイラを作成します。コンパイラそのものもCを使って開発します。当面の目標はセルフホスト、すなわち自作コンパイラでそれ自身のソースコードをコンパイルできるようにすることです。 このでは、コンパイラの説明の難易度が急に上がりすぎないように、様々なトピックを書全体を通じて次第に掘り下げていくという形で説明することにしました。その理由は次のとおりです。 コンパイラは、構文解析、中間パス、コード生成といった複数のステージに概念的に分割することができます。よくある教科書的アプローチでは、それぞれのトピックについて章を立てて解説を行うことになりますが、そのよう

    ymmtmdk
    ymmtmdk 2018/11/05
  • Javaバイトコード入門

    https://ntt-developers.github.io/ntt-tech-conference/2022/ 従来は Docker がコンテナエンジンとして幅広く利用されてきましたが、最近は KubernetesDocker 対応を打ち切るなど、風向きが変わってきました。 セッションでは、Docker に代わって普及しつつあるコンテナエンジンである containerd について、Docker との違いや移行方法を紹介します。 P2P でのイメージ配布など、最新の機能についても紹介します。

    Javaバイトコード入門
    ymmtmdk
    ymmtmdk 2018/11/05
  • Java仮想マシン - Wikipedia

    スタック[編集] bipush、 sipush - byte値、 short値をスタックに積む。 ldc - コンスタントプール内の4バイトの定数(int値、float値、java.lang.String)の内1バイト以内でエントリ番号を指定できるものをスタックに積む。 ldc_w - エントリ番号が1バイトでは足りないときに使う。 ldc2_w - コンスタントプール内の8バイトの定数(long値、double値)をスタックに積む。 iconst_m1、 iconst_0、 iconst_1、 iconst_2、 iconst_3、 iconst_4、 iconst_5 - intの-1、0、1、2、3、4、5をスタックに積む。 lconst_0、 lconst_1 - longの0、1をスタックに積む fconst_0、 fconst_1、 fconst_2 - floatの0、1、2

    Java仮想マシン - Wikipedia
    ymmtmdk
    ymmtmdk 2018/11/05
  • Super Technique 講座~longjmpと例外

    プログラムの流れを制御する手段として、いわゆる「構造化構文(for とか if とか)」、悪名高い「goto 文」などがあるのは周知のことだが、かなり特殊なものとして、「setjmp, longjmp」による「非ローカル分岐」と呼ばれるものがある。この「非ローカル分岐」は「非ローカル」と言うだけあって、ある関数の中から、別な関数に制御を移すことができたりする。まあ、そのために乱用すべきではなく、注意して使わなくてはならないライブラリ関数なのだが、実はこれは JavaC++ で言語の上で実装されている「例外」の基礎となるものである。だから、まずこの標準ライブラリ関数「setjmp, longjmp」について解説しよう。 → Java 講座の「例外」 setjmp, longjmp とは どうやって実現してるの? setjmp/longjmp の利用例~インタプリタ 補追1:setjmp

    ymmtmdk
    ymmtmdk 2018/11/05
  • Practical Scheme

    Shiro Kawai まだ下書き Schemeの特徴をあげるときに、「継続」や「call/cc」が出て来ないことはない。 でも、R5RSのcall/ccの項をいくら読んでも、どうもよくわからない。 call/ccを使えばC言語のbreakみたいなのとか、コルーチンとかいう スレッドもどきとかが書ける、というのはわかったけど、一体そういうのが書けて 何が嬉しいのか、そこんとこがピンと来ないんだ。 今、そこにある継続 プログラミングの世界の概念には、禅の公案のようなものがある。 それを説明する文章はほんの一文なのに、最初に目にする時、 その文は全く意味をなさない、暗号のように感じられる。 だがひとたびその概念を理解すると、 その概念の説明は確かにその一文で説明されているのがわかるのだ。 そんな、「分かれば分かる」という禅問答の中でも 「継続」は最も謎めいたものの一つと言えるだろう。 文献を紐

    Practical Scheme
    ymmtmdk
    ymmtmdk 2018/11/05
  • Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」

    認証を持たないウェブアプリケーションをいざ認証に対応させようと思うと案外面倒でモチベーションを無くしてしまうなんて事もよく起きうる話です。特に社内向けのアプリケーションを作っていたら番で使う事になってしまって、なんて話は良くある話です。開発でDB を見るのはちょっと...。でも既存のコードをゴリゴリと触りたくない。そんな場合にログイン認証部分だけマイクロサービス化できると気持ちも幾分和らぎます。今日はそんなちょっと便利なサーバ「loginsrv」を紹介したいと思います。 GitHub - tarent/loginsrv: JWT login microservice with plugable backends such as OAuth2, Github, htpasswd, osiam loginsrv is a standalone minimalistic login se

    Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」
    ymmtmdk
    ymmtmdk 2017/06/02
  • 15パズル自動解答プログラムの作り方

    ymmtmdk
    ymmtmdk 2017/06/01
  • webpack dev server v2 では静的ファイルもライブリロード可能になってた / JeffreyFrancesco.org

    webpack dev server v2 では静的ファイルもライブリロード可能になってた 公開日: 2017年1月28日 タグ: development, node.js, webpack ちゃんと webpack を試す前はなんとなく雰囲気で「webpack dev server ってライブリロード機能付きの開発用サーバでしょ」みたいなとても適当な認識でいたのだけど、実際にさわってみると思ってたのとはちょっと違ってて、たとえば webpack.config.js に module.exports = { // build したものは 'public/assets/' 以下に書き出される設定 devServer: { contentBase: path.join(__dirname, 'public'), publicPath: '/assets/' } } という設定を書いたとしても、

    ymmtmdk
    ymmtmdk 2017/06/01
  • crontabをVimで編集した時に出るエラーの対処法 - SanRin舎

    ymmtmdk
    ymmtmdk 2017/06/01
  • OS X time until (system/display/disk) sleep?

    ymmtmdk
    ymmtmdk 2017/04/13
  • How to use Fn keys in tmux?

    I have a bind in vim for F5 key to trim whitespaces and I'm unable to use it in tmux. Instead of that letter "T" appears. Is there's any solution for that? Actually it was working in putty, now I've switched to Xshell4. Can this be TERM issue? inside tmux $TERM is screen

    How to use Fn keys in tmux?
    ymmtmdk
    ymmtmdk 2017/04/12
    “setw -g xterm-keys on”
  • termcapとterminfo | doda's blog

    termcapとterminfo 端末エミュレータとと切っても切れない関係にあるのが、termcap&terminfoデータベースです。このtermcap&terminfoデータベースですが、書かれている内容が文字や記号の羅列で意味がとりづらく、「よくわからないけれどこう書けば動く」というような黒魔術的な扱いがされる事も多いようです。 今回はこのtermcap&terminfoデータベースについて書いてみたいと思います。 どんな物か termcapやterminfoは、端末の動作の違いを吸収するためにあります。 dateやcatなどの大多数の一般的なコマンドでは文字列を順番に出力するだけなので、端末の違いが影響する事はほとんどありません。これに対しviなどの画面全体を使うようなプログラムでは、カーソルを指定した位置に移動したり、指定した位置に新しい行を挿入するといった操作が必要になります。

    ymmtmdk
    ymmtmdk 2017/04/12
  • リスコフの置換原則

    それらは、先人達がオブジェクト指向を研究したり実践したりしていく中で、発見されてきたものです。 どれも、オブジェクト指向を正しく利用するためには非常に重要なことですので、今後順次解説していきます。 今回は、リスコフの置換原則のお話です。 英語で言うと "the Liskov Substitution Principle" ということで、LSP と略されたりします。 コンテンツ 例えれば職能 あなたの羅針盤 実際のはなし 契約 犯罪者 ポリモーフィズムの羅針盤 オススメ リスコフの置換原則…と聞くとまず思うのが、「リスコフ」ってなに?ということだと思います。 はい、「リスコフ」というのはこの原則を提唱した人の名前です。 「そういう名前の人が言い出したんだな」とだけ思っとけば OK です。 そうすると、肝心なのは「置換原則」ってとこだけですね。 じゃあ、何と何を置換するでしょう? はい、スーパ

    ymmtmdk
    ymmtmdk 2017/04/07
  • vimとxargsで表示がおかしくなる - MEMOcho-

    まとめてファイルを開く必要があるときに以下のようにやることがある $ find . -name '*.txt' | xargs vimだがこんなwarningが出た上、vimを終了した後にターミナルの表示がおかしくなる Vim: Warning: Input is not from a terminal # vim終了後 $ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean % 別のウィンドウを使えば済むがこのたびにターミナルを変えるのは面倒なため解決策がないか調べてみた 解決策はこちらのページに見つかった vim - Invoking vi through find | xargs breaks my

    vimとxargsで表示がおかしくなる - MEMOcho-
    ymmtmdk
    ymmtmdk 2017/04/03
  • ターミナルからプライベートIPアドレスとMACアドレス、ルーティングテーブルを確認する - bambinya's blog

    自分のlaptopのプライベートIPアドレスがどのように割り当てられているか、調べる。 ターミナルから$ ifconfig をうつ。複数のインターフェースが表示される。 上記は「lo0」「gif0」「stf0」「en0」が表示されている。 他にも「en1」「en2」「p2p0」「awdl0」「bridge0」「utun0」が表示された。 各インターフェースの名前と役割 lo0(loopback) ネットワークのテストに使えるよう用意された仮想インターフェース、NICがなくても、このloは表示される。inetの127.0.0.1がIPアドレスとして自動で割り当てられる。 gif0(generic tunnel interface) IPv6/IPv4トンネリングを行うときに使うインターフェース。IPv6/IPv4トンネリングとは、IPv4(またはIPv6)をサポートするネットワークに、IPv

    ターミナルからプライベートIPアドレスとMACアドレス、ルーティングテーブルを確認する - bambinya's blog
    ymmtmdk
    ymmtmdk 2017/03/31
    “ネットワークユーティリティ”
  • PF: トラフィックリダイレクション (ポートフォワーディング)

    ymmtmdk
    ymmtmdk 2017/03/31