Неиспользуемые правила и терминалы означают, что вы описали правила, которые не могут быть достигнуты во время синтаксического анализа (во многом как «если истина, тогда 1 еще 2», ветвь 2 никогда не будет достигнута).Для получения более подробной информации проверьте вывод --info.
Что касается $$, это экстрактор данных: допустим, у вас есть лексер, который создает токен следующего типа:
data TokenType = INT | SYM
data TokenLex = L TokenType String
где TokenType используется для различения полезных данных и ключевых слов.
В действии вашего парсера вы можете извлечь строковую часть, используя $$
%token INTEGER {L INT $$ }
%token OTHER {L _ $$}
foo : INTEGER bar INTEGER { read $1 + read $3 }
| ...
В этом правиле $ 1означает «дай мне содержимое первого INTEGER» и $ 3 «содержимое второго INTEGER».$ 2 означает «дай мне содержимое бара (что может быть еще одним сложным правилом).
Благодаря $$, $ 1 и $ 3 - это geniune Haskell String, потому что мы сказали Happy, что« содержимое INTEGER - это »Строка «часть TokenLex», а не весь токен.