2016-09-08 4 views
1

Я работаю над созданием анализатора в Haskell с использованием комбинаторов парсера. У меня есть проблема с синтаксическими ключевыми словами, такими как «while», «true», «if» и т. Д.Haskell - компиляторы парсера ключевые слова

Таким образом, проблема, с которой я столкнулась, заключается в том, что после ключевого слова существует требование о том, что существует разделитель или пробел, например в заявлении if cond then stat1 else stat2 fi;x = 1 с этим утверждением все ключевые слова имеют либо пространство перед ними, либо полуточку. Однако в разных ситуациях могут быть разные разделители.

В настоящее время я реализовал это следующим образом:

keyword :: String -> Parser String 
keyword k = do 
    kword <- leadingWS (string k) 
    check (== ';') <|> check isSpace <|> check (== ',') <|> check (== ']') 
    junk 
    return word 

однако проблема с этим ключевым словом парсер является то, что это позволит программы, которые имеют такие заявления, если; cond then stat1 else stat2 fi

Мы попытались передать в (Char -> Bool) ключевое слово, которое затем будет передано для проверки. Но это не сработает, потому что, когда мы анализируем ключевое слово, мы не знаем, что такое разделитель.

Мне было интересно, не могу ли я помочь с этой проблемой?

+2

Просто потому, что ключевое слово следует точка с запятой, это не значит, что он используется правильно. Ключевые слова всегда являются частью некоторой более синтаксической структуры. А именно, ключевое слово - это всего лишь определенный токен, на котором основана ваша грамматика. Единственное различие между ключевым словом и идентификатором заключается в том, что ключевое слово распознается грамматикой, а не рассматривается как общий токен, оставшийся на более поздних этапах анализа и оценки. – chepner

+0

Саму половину - это еще один знак; у вас должен быть другой комбинатор, который распознает правильные коллекции других токенов. (В этом смысле анализатор действительно выполняет и лексический анализ - преобразование потока байтов в поток токенов - и синтаксический анализ - преобразование потока токенов в абстрактное синтаксическое дерево.) – chepner

ответ

3

Не пытайтесь обрабатывать разделители в keyword, но вы должны убедиться, что keyword "if" не будет путать с идентификатором «iffy» (см. Комментарий sepp2k).

keyword :: String -> Parser String 
keyword k = leadingWS $ try (do string k 
           notFollowedBy alphanum) 

Обработка Сепараторы для заявлений будет идти, как это:

+0

Если вы делаете это так , идентификатор «iffy» можно было бы вместо этого проанализировать как ключевое слово «if», за которым следует идентификатор «fy». Я верю (и я признаю, что я полностью догадываюсь), почему ОП решил, что «после того, как ключевое слово имеет требование о том, что есть разделитель или пробел», это запретить это. – sepp2k

+0

О, я вижу, возможно, я пропустил этот вопрос в вопросе. Я подумаю и уточню свой ответ, если мне есть что добавить. –

+0

Я толкнул более полный пример https://github.com/steshaw/haskell-shebang-examples/blob/master/stack/imperative.hs –

Смежные вопросы