if-then[-else] ケースを解析するための正しいルールを作成するにはどうすればよいですか? ここにいくつかの文法があります:
{
module TestGram (tparse) where
}
%tokentype { String }
%token one { "1" }
if { "if" }
then { "then" }
else { "else" }
%name tparse
%%
statement : if one then statement else statement {"if 1 then ("++$4++") else ("++$6++")"}
| if one then statement {"if 1 then ("++$4++")"}
| one {"1"}
{
happyError = error "parse error"
}
この文法は、次の式を正しく解析します。
> tparse ["if","1","then","if","1","then","1","else","1"]
"if 1 then (if 1 then (1) else (1))"
ただし、コンパイルすると、シフト/削減の競合に関する警告が発生します。幸福へのドキュメントには、そのような競合の例が含まれています: http://www.haskell.org/happy/doc/html/sec-conflict-tips.html
示されている解決策は 2 つあります。1 つ目は、再帰型を変更することです (この場合の方法は明確ではありません)。2 つ目は、何も変えないことです。このオプションは私には問題ありませんが、相談が必要です。