Parserについて勉強したい
Parserについて
Perl で簡単にパーザを書く - tokuhirom's blog
パーサー
再帰下降構文解析で電卓プログラムを実装する - embryo
式(expression)、項(term)、因子(factor)と呼ぶのかぁ。
Bool用Parserに変えて見る
下記のような真偽値をパースするパーサを作って見る。
1 | 1 & 0
ほぼ、元の四則演算そのものなんですが・・
&の優先順位が|よりも高いので、除算のところを&にして、加算のところを|にして見ました。
あとは0の扱いに注意が必要でundefだとエラーにしました。
計算する部分も実装して見ました。
use 5.018000; package Calc { use Carp (); sub parse { local $_ = $_[1]; _parse_expr(); } sub err { my ($msg) = @_; my $ret = join('', $_, "\n", (" " x pos()) . "^\n", $msg, "\n", ); Carp::croak $ret; } sub _parse_expr { my @nodes; until (/\G\s*\z/gc) { my $m = _parse_add() or do { err "Syntax error"; }; push @nodes, $m; } return ['expr', @nodes]; } sub _parse_add { my $mul = _parse_mul() or return undef; while (m{\G\s*(\|)}gc) { my $op = $1; my $lhs = _parse_mul() // die "Cannot parse mul after '$op' : " . pos(); $mul = [$op, $mul, $lhs]; } return $mul; } sub _parse_mul { my $node = _parse_term() // return undef; while (m{\G\s*(\&)}gc) { my $op = $1; my $lhs = _parse_term() // die "Cannot parse expr after '$op' : " . pos(); $node = [$op, $node, $lhs]; } return $node; } sub _parse_term { if (/\G\s*([01])/gc) { return $1; } elsif (/\G\s*\(/gc) { my $expr = _parse_add(); /\G\s*\)/gc or err "No closing paren after opening paren."; return $expr; } return undef; } sub execute { $DB::single = 1; my $node = $_[1][1]; if (ref($node)) { return _execute($node); } else { return $node; } } sub _execute { my $node = shift; my $ope = $node->[0]; my $left = $node->[1]; my $right = $node->[2]; if (ref($right)) { my $right = _execute( $right ); } if ( $ope eq "&" ) { if ( $left == 1 && $right == 1 ) { return 1; } return 0; } else { if ( $left == 1 || $right == 1 ) { return 1; } return 0; } } } my $node = Calc->parse('1|1&0'); use Data::Dumper; warn Dumper($node); warn Calc->execute($node);
shibuya.pm テクニカルトーク#18に参加しました。
レベルが高いトークが聞けて、刺激を受けた。すごいなぁ。。
まぁ、でも、敷居は下げつつ、1mmでも近ずけるようになりたいものです。
vue-cli(Webpack)のサーバーサイドを8080ポートnode(express)で3000ポートで開発したいのですが404
vueのajax部分(axios)
this.canvas.toBlob(function (blob) { axios.post('./api', {data: blob}, { headers: { 'content-type': 'multipart/form-data' }, params: { } } ) })
vueのindex.js(リバースプロキシの設定)
proxyTable: { '/api': { target: 'http://localhost:3000', changeOrigin: true } },
なぜかpostで投げると404,getにすると200が帰る。
getでもデータ送れるのかな?
# 結局原因は・・・
express側の記述がgetだったので、postを受け取れなかっただけでした。
情けない・・
格安心拍計を試す
AliexpressでXD-58Cと検索すると最安値1.8$で売っていた心拍センサーが届いたので
早速試して見た。
スケッチ>ライブラリをインクルード>ライブラリを管理を開いて、
検索をフィルタのテキストボックスにPulseSensorと入力して
インストール。
ファイル>スケッチの例>PulseSensor PlayGroud>PulseSensor_BPMを開いて、
loop関数を以下のように書き換える
void loop() { delay(20); Serial.print("test"); Serial.print("\t"); Serial.println(pulseSensor.getBeatsPerMinute()); Serial.flush(); }
問題
値は取れたのでOKだけれども。基盤むき出しで、指に巻きつけるものも何もついていないので
なんとかしないと。
Mishima.pm #3 を開催しました
今日は三島.pm#3 でした。
connpass.com
4年ぶりの開催でした。
参加者は4名でしたが、ゆったりと時は流れ
時間はたっぷりあったので、発表後のディスカッションなど濃密にできました。
コードリーディングは1回やってみたかった企画でした。
モジュールのオーサー@karupaneruraさんにお願いしてAnikiを読みました。
約1時間みっちりと脱線しながら、解説していただけました。
非常に参考になりました。
- forkした場合、子が死んだ時もいい感じに扱う必要がありなど。
- 毎回接続に行くか?あたりの話。要件やDBの接続コストなどを考慮に入れて変わる。
- Anikiのリレーションの判断ロジックについての説明。リレーション先のプライマリキーやユニークを持つで判断など。
- 薄くラップして、キャッシュしたり、必要な部分は付け足している感じの説明。
反省点としてはTypeC接続ができないことを事前に通知していなかったところですね。
HDMIはありました。
さて、懇親会ではうなぎ(すみの坊本町店)で盛り上がりつつ、懇親できました。
私的には、最初の骨がカリカリで塩の加減もいい感じでした。
うなぎの後、ジャストタイムで、竹倉温泉行きのバスに乗れて、竹倉温泉まで行きました。
最初行ったところが今年3月で営業終了というアクシデントで焦りました。
その後、違うところを見つけて、赤湯を堪能しました。
朝から営業しているのでハッカソンにも行けそうですねという話になりました。
遠路来ていただきありがとうございました。
次回実施時期は、未定ですが、ご要望があれば開催しますので
こっそり声かけてください。
目標は年1回くらいで開催したいですね。