kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

ひょっとしたら役に立つかもしれないScala Tips(3) 二項演算子を行頭に置く

Scalaの場合、パーザコンビネータでパーザ書いてる時によくあることなのだが、読みやすさのために、以下のように行頭に二項演算子を置いて式をつなげたい、ということがしばしばある。

lazy val statement: Parser[Statement] = 
            ifStatement
          | forStatement
          | whileStatement

Javaだと(演算子の多重定義ができないので上のような例は無理だが)、条件式を||でつなぐときなどは、同様の書き方ができる。しかし、Scalaの場合、行末の;を省略できる仕様のため、最初のifStatementの後の改行で式が終わったと判断されてしまい、その次の| forStatementでエラーになってしまう。このような場合、演算子によってつなげたい一連の式を()で囲み、以下のようにすることでエラーを防ぐことができる。

lazy val statement: Parser[Statement] = (
            ifStatement
          | forStatement
          | whileStatement
          )