if式を追加しよう
構文解析
if式の構文を考えましょう。今回は例として以下のような構文とします。
if 条件式 then 条件が真の時実行される式 else 条件が偽の時実行される式
まず、条件式で使われる等号や不等号の構文解析をする必要があります。等号や不等号は、足し算や掛け算よりも優先度が低いです。
3+2==1+4 // (3+2)==(1+4)と構文解析される
さらに、等号や不等号は非結合な演算子です。非結合とは、1<2<3
やx==y==z
のような文字列は文法的に正しくない、ということです。
(pythonを使ったことのある人は、pythonでは1<x<3
のような条件式が使えるのを知っているかもしれません。これは、(式)<(式)<(式)
という文字列を、(式)<(式) && (式)<(式)
と解釈するような文法になっているからです。このような文法をサポートしてみるのも面白いでしょう。)
よって等号や不等号の文法は次のようになります。
Compare = Expression ("<" / ">" / "==") Expression / Expression
ASTに変換する部分は容易に書けます。"<", ">", "=="のtagはそれぞれLT, GT, EQ等が良いでしょう。
それでは、if式の方の構文解析に取り掛かります。これもシンプルです。
IfExpr = "if " _ Compare _ "then " _ Compare _ "else " _ Compare / Compare
(_
は0個以上の空白、改行を無視するために入っています。)
Assignで使われているExpressionをIfExprに変えるのを忘れないようにしましょう。
評価
<, ==, >の評価は今までの四則演算を参考にしましょう。if式の評価規則は、
- まず条件式を評価
- 条件式がtrueだったらthen以下を評価
- そうでなければelse以下を評価
となります。ここで、何をもってtrueとするかという所に選択の余地があるわけですが、今回はJavaScriptでtrueとされる値がtrueであるということにしましょう。
書き終えたら、
if 3<5 then 1 else 2
if 3==5 then 1 else 2
を実行してみて、正しく動くか確認しましょう。