Skip to main content

if式を追加しよう

構文解析

if式の構文を考えましょう。今回は例として以下のような構文とします。

if 条件式 then 条件が真の時実行される式 else 条件が偽の時実行される式

まず、条件式で使われる等号や不等号の構文解析をする必要があります。等号や不等号は、足し算や掛け算よりも優先度が低いです。

3+2==1+4 // (3+2)==(1+4)と構文解析される

さらに、等号や不等号は非結合な演算子です。非結合とは、1<2<3x==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式の評価規則は、

  1. まず条件式を評価
  2. 条件式がtrueだったらthen以下を評価
  3. そうでなければelse以下を評価

となります。ここで、何をもってtrueとするかという所に選択の余地があるわけですが、今回はJavaScriptでtrueとされる値がtrueであるということにしましょう。

書き終えたら、

if 3<5 then 1 else 2
if 3==5 then 1 else 2

を実行してみて、正しく動くか確認しましょう。