Submit Search
Upload
Smalltalkで四則演算パーサ
•
1 like
•
3,457 views
M
Masashi Umezawa
Follow
CROSS 2014 「言語CROSS」での四則演算パーサ作成課題の解答です
Read less
Read more
Technology
Education
Report
Share
Report
Share
1 of 11
Download now
Download to read offline
Recommended
150420 flash005 forループと関数
150420 flash005 forループと関数
elephancube
5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流
Yuya Takeyama
Cubby 2006-08-23
Cubby 2006-08-23
Agata Toshikata
20081120 lt11th ace
20081120 lt11th ace
Masanori Hayashi
Javaキャッチアップ(SE9-12)
Javaキャッチアップ(SE9-12)
risa buto
言語処理系入門3
言語処理系入門3
Kenta Hattori
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
MultilineクラスとMultilineメソッド
MultilineクラスとMultilineメソッド
Masashi Umezawa
Recommended
150420 flash005 forループと関数
150420 flash005 forループと関数
elephancube
5分でわかる? 関数型 PHP の潮流
5分でわかる? 関数型 PHP の潮流
Yuya Takeyama
Cubby 2006-08-23
Cubby 2006-08-23
Agata Toshikata
20081120 lt11th ace
20081120 lt11th ace
Masanori Hayashi
Javaキャッチアップ(SE9-12)
Javaキャッチアップ(SE9-12)
risa buto
言語処理系入門3
言語処理系入門3
Kenta Hattori
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
MultilineクラスとMultilineメソッド
MultilineクラスとMultilineメソッド
Masashi Umezawa
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
Masashi Umezawa
FileManで楽々ファイル操作
FileManで楽々ファイル操作
Masashi Umezawa
TruffleSqueakの紹介
TruffleSqueakの紹介
Masashi Umezawa
SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門
Masashi Umezawa
TaskItの紹介
TaskItの紹介
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Masashi Umezawa
Revealing ALLSTOCKER
Revealing ALLSTOCKER
Masashi Umezawa
TarandocでJSONを永続化
TarandocでJSONを永続化
Masashi Umezawa
Dockerizing pharo
Dockerizing pharo
Masashi Umezawa
今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門
Masashi Umezawa
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
Masashi Umezawa
VerStixの紹介
VerStixの紹介
Masashi Umezawa
Oldtalk - あのころの処理系は今
Oldtalk - あのころの処理系は今
Masashi Umezawa
Pyonkeeを鳴らす
Pyonkeeを鳴らす
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ
Smalltalk勉強会 - 過去、現在、そして未来へ
Masashi Umezawa
Tarantalk
Tarantalk
Masashi Umezawa
Smalltalkと型について
Smalltalkと型について
Masashi Umezawa
Introduction of Pharo 5.0
Introduction of Pharo 5.0
Masashi Umezawa
Why!? Smalltalk
Why!? Smalltalk
Masashi Umezawa
Pillarの紹介
Pillarの紹介
Masashi Umezawa
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
More Related Content
More from Masashi Umezawa
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
Masashi Umezawa
FileManで楽々ファイル操作
FileManで楽々ファイル操作
Masashi Umezawa
TruffleSqueakの紹介
TruffleSqueakの紹介
Masashi Umezawa
SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門
Masashi Umezawa
TaskItの紹介
TaskItの紹介
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Masashi Umezawa
Revealing ALLSTOCKER
Revealing ALLSTOCKER
Masashi Umezawa
TarandocでJSONを永続化
TarandocでJSONを永続化
Masashi Umezawa
Dockerizing pharo
Dockerizing pharo
Masashi Umezawa
今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門
Masashi Umezawa
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
Masashi Umezawa
VerStixの紹介
VerStixの紹介
Masashi Umezawa
Oldtalk - あのころの処理系は今
Oldtalk - あのころの処理系は今
Masashi Umezawa
Pyonkeeを鳴らす
Pyonkeeを鳴らす
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ
Smalltalk勉強会 - 過去、現在、そして未来へ
Masashi Umezawa
Tarantalk
Tarantalk
Masashi Umezawa
Smalltalkと型について
Smalltalkと型について
Masashi Umezawa
Introduction of Pharo 5.0
Introduction of Pharo 5.0
Masashi Umezawa
Why!? Smalltalk
Why!? Smalltalk
Masashi Umezawa
Pillarの紹介
Pillarの紹介
Masashi Umezawa
More from Masashi Umezawa
(20)
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
FileManで楽々ファイル操作
FileManで楽々ファイル操作
TruffleSqueakの紹介
TruffleSqueakの紹介
SmalltalkBoltでUFFI入門
SmalltalkBoltでUFFI入門
TaskItの紹介
TaskItの紹介
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
Revealing ALLSTOCKER
Revealing ALLSTOCKER
TarandocでJSONを永続化
TarandocでJSONを永続化
Dockerizing pharo
Dockerizing pharo
今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
VerStixの紹介
VerStixの紹介
Oldtalk - あのころの処理系は今
Oldtalk - あのころの処理系は今
Pyonkeeを鳴らす
Pyonkeeを鳴らす
Smalltalk勉強会 - 過去、現在、そして未来へ
Smalltalk勉強会 - 過去、現在、そして未来へ
Tarantalk
Tarantalk
Smalltalkと型について
Smalltalkと型について
Introduction of Pharo 5.0
Introduction of Pharo 5.0
Why!? Smalltalk
Why!? Smalltalk
Pillarの紹介
Pillarの紹介
Recently uploaded
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
Recently uploaded
(8)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
Smalltalkで四則演算パーサ
1.
CROSS 2014 言語CROSS Smalltalkによる 四則演算パーサ別解解説 2014 SoftUmeYa,
LLC Masashi Umezawa
2.
四則演算パーサ課題 数式のパース、計算処理を実装する 間違った入力が行われた場合も、単なるエラーとせず、 なんらかの形で構文に謝りがある事をユーザーに伝 えるようにして下さい。 入力例:(1*2+(3*4) 出力例:数式が不正です 文字列のパース処理の比較が主なポイントなので、eval のような機能や、上記のような機能を持ったライブラリを そのまま使う事は禁止とします。
3.
どう解く? PetitParser PEGパーサコンビネータ http://scg.unibe.ch/research/helvetia/petitparser OMeta パーサ定義・パターンマッチDSL http://tinlizzie.org/ometa/ OMetaは以前紹介したのでPetitParserに 参考: 「OMetaの紹介」 • ftp://swikis.ddo.jp/SqueakDevJa/events/ScalaOff2008/OMetaIntro.pdf
4.
PetitParser オブジェクトにasParserと送るとパーサ ができる あとはそれらをメッセージ送信で組み合 わせる できあがったコードはほぼBNFと同じよ うに見える
5.
例: SQLiteのselect-core http://www.sqlite.org/syntaxdiagrams.html#select-core
6.
PetitParserでの表現 シンタックスグラフをメッセージ送信に selectCore ^ select ,
(distinct / all) optional , (resultColumn separatedBy: $, asParser trim) , (from , joinSource) optional , (where , expression ) optional , (groupBy , (orderingTerm separatedBy: $, asParser trim), ('HAVING' asParser caseInsensitive trim , expression) optional ) optional
7.
四則演算パーサの定義 クラスを導入しないパターン number :=
#digit asParser plus token trim 数値パーサ作成 ==> [ :token | token inputValue asNumber ]. terms := PPUnresolvedParser new. primary := PPUnresolvedParser new. それ以外のパーサ作成 parenthesis := PPUnresolvedParser new. (def: で後から定義) addition := PPUnresolvedParser new. multiplication := PPUnresolvedParser new. multiplication def: ((primary separatedBy: ($* asParser / $/ asParser) trim) foldLeft: [ :a :op :b | a perform: op asSymbol with: b ]). addition def: ((multiplication separatedBy: ($+ asParser / $- asParser) trim) foldLeft: [ :a :op :b | a perform: op asSymbol with: b ]). parenthesis def: ($( asParser trim , terms , $) asParser trim ==> [ :nodes | nodes second ]). 乗除、加減、括弧の順で primary def: number / parenthesis. パーサ定義 terms def: addition / multiplication. parser := terms end. 終端を定義して完成!
8.
ワークスペースで実行 parser parse: '1+2*(3+4)' "=>
15" parser parse: '(1+2*(3+4)' "=> $) expected at 10"
9.
四則演算パーサの定義(2) クラスを導入するパターン PPCompositeParserのサブクラスとして ArithmeticParser定義 PPCompositeParser
subclass: #ArithmeticParser instanceVariableNames: 'terms addition multiplication primary number parentheses' パース要素ごとにメソッドを定義 parentheses ^ $( asParser trim , terms , $) asParser trim ==> [ :nodes | nodes second ]
10.
クラス導入の利点 ツールの恩恵 対話的デバッグ、ビジュアライズ等が可能
11.
ワークスペースで実行(2) ArithmeticParser parse: '1+2*(3+4)' "=>
15" ArithmeticParser parse: '(1+2*(3+4)' "=> $) expected at 10"
Download now