Парсер в Хэппи - PullRequest
       57

Парсер в Хэппи

3 голосов
/ 24 июня 2010

Я пытаюсь выполнить синтаксический анализатор с помощью Happy (Haskell Tool), но получаю сообщение об ошибке: «unused ruled: 11 и неиспользуемые терминалы: 10», и я не знаю, что это значит.С другой стороны, я действительно не уверен в использовании параметров $ i в утверждениях правил, я думаю, что моя ошибка из-за этого.Если кто-нибудь может помочь мне ...

Ответы [ 3 ]

4 голосов
/ 25 июня 2010

Если вы получаете эти сообщения, это не ошибка, это просто означает, что часть вашей грамматики не используется, потому что она недоступна из начального символа.Чтобы узнать больше о том, как Happy понимает вашу грамматику, используйте флаг --info для Happy:

happy --info MyParser.y

, который генерирует файл MyParser.info в дополнение к обычному MyParser.hs.

3 голосов
/ 24 июня 2010

Неиспользуемые правила и терминалы - это части вашей грамматики, к которым нет способа добраться из операторов синтаксического анализа верхнего уровня, если я правильно помню. Чтобы узнать, как использовать параметры $$, прочитайте счастливое руководство пользователя .

Символ $$ является заполнителем, который представляет значение этого токена. Обычно значением токена является сам по себе токен, но используя $$ символом вы можете указать какой-то компонент объекта токена, который будет значением.

1 голос
/ 28 июля 2010

Неиспользуемые правила и терминалы означают, что вы описали правила, которые не могут быть достигнуты во время синтаксического анализа (во многом как «если истина, тогда 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», а не весь токен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...