四則演算パーサー
(Elixir ver)
コード: https://github.com/ohr486/LearnLanguage2017inODC/tree/master/parser_sample
Learn Languages 2017 in ODC
おーはら@ohrdev
課題
expression ::= additive
additive ::= multitive ( ‘+’ multitive | ‘-’ multitive )*
multitive ::= primary ( ‘*’ primary | ‘/’ primary )*
primary ::= ‘(‘ expression ‘)’ | number
number ::= ‘0’ | [1-9][0-9]*
パーサーI/F
• 入力: 四則演算の文字列
• 出力:
• 成功時: {:ok, <パース結果>, <残りの文字列>}
• 失敗時: {:error, <入力文字列>}
• 例) 数値(number)を取り出すパーサーPの場合
• P(“123”) -> {:ok, 123, “”}
• P(“123abc”) -> {:ok, 123, “abc”}
• P(“abc”) -> {:error, “abc”}
BaseModule
• 複雑なパーサーの元になる基本的なパーサーライブラリ
• one_of: 文字にマッチするか
• reg_of: 正規表現にマッチするか
• either: 2つのパーサーのどちらかを適用
• seq: パーサーを順番に適用
• (rep: パーサーの繰り返し)
• loop: パーサーの繰り返し
• map: 結果に対して関数を適用
CalcModule
• BaseModuleのパーサーの組み合わせでできる、四則演算パー
サーモジュール、BaseModuleを使って構築
• BNFにそれぞれ対応
テスト
BaseModule.one_of
BaseModule.reg_of
BaseModule.either
BaseModule.seq
BaseModule.rep
BaseModule.loop
BaseModule.map
CalcModule(再掲)
• BaseModuleのパーサーの組み合わせでできる、四則演算パー
サーモジュール
• BNFにそれぞれ対応
CalcModule 補助関数/補足
• パイプ演算子(|>)
• Fun1 ( arg ) => arg |> Fun1
• Fun1 ( Fun2 ( arg ) ) => arg |> Fun2 |> Fun1
• Fun1 ( arg1, arg2 ) => arg1 |> Fun1 ( arg2 )
CalcModule.number
CalcModule.primary
CalcModule.multitive
CalcModule.addtive
CalcModule.expression
CalcModule 評価
テスト結果

Elixir解答