Alex lex.x сборник: не входит в сферу 'begin'

У меня есть следующие утверждения в Lex.x для анализа комментариев блока.

<0>  "//".*                 { tokWValue LTokComment   }            
<0>  "/*"                   { begin blockcomment      }            
<blockcomment> "*/"         { begin 0                 }            
<blockcomment> .            { tokWValue LTokComment   }  

Но если я создаю Lex.hs, используя Alex, он не добавляет функцию 'begin'. Это приводит к приведенной ниже ошибке компиляции.

src/Lex.x:367:18: Not in scope: ‘begin’
src/Lex.x:368:18: Not in scope: ‘begin’

Есть идеи, что может быть не так?

Я использую обертку posn

1 ответ

Решение

Стартовые коды доступны только при использовании любого из monad-... оберток.

Если вы читаете документы по оболочке монады - Раздел 5.3.3 - Оболочка "монады" - вы увидите, что это первая оболочка, которая отслеживает начальный код.

Вы также можете убедиться в этом, найдя файлы обертки alex - найдите каталог, содержащий файлы AlexWrapper-basic, AlexWrapper-posnи т. д. На OS X при установке платформы Haskell они расположены в каталоге, таком как /Library/Haskell/ghc-7.10.2-x86_64/share/alex-3.1.4, Функции begin а также andBegin встречаются только в обертках, связанных с монадой.

Другие вопросы по тегам