hakeの日記

Windows環境でプログラミングの勉強をしています。

raccを試す その2.1

conflictの原因が全く分からない。とりあえずトークンthenの省略を付加にしたら出なくなった。

rule
  target: stmt
        | /* none */ { result = nil }

  stmt  : if_stmt
        | expr

  if_stmt:IF expr then else END
             { result = (val[1]!=0?val[2]:val[3]) }

  then   : THEN stmt       { result = val[1] }

  else   : ELSE stmt       { result = val[1] }
         | /* none */      { result = nil }

追記(09/08/19)

分かったような気がする。

if 1 then -1 else -99 end

のような文の場合にthenが省略されてしまうと、-1が条件の一部なのかthen節の一部なのか判別出来なくなってしまうってことで良いのかな?
実際thenなしだとエラーになりました。