Я работаю над созданием анализатора в 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) ключевое слово, которое затем будет передано для проверки. Но это не сработает, потому что, когда мы анализируем ключевое слово, мы не знаем, что такое разделитель.
Мне было интересно, не могу ли я помочь с этой проблемой?
Просто потому, что ключевое слово следует точка с запятой, это не значит, что он используется правильно. Ключевые слова всегда являются частью некоторой более синтаксической структуры. А именно, ключевое слово - это всего лишь определенный токен, на котором основана ваша грамматика. Единственное различие между ключевым словом и идентификатором заключается в том, что ключевое слово распознается грамматикой, а не рассматривается как общий токен, оставшийся на более поздних этапах анализа и оценки. – chepner
Саму половину - это еще один знак; у вас должен быть другой комбинатор, который распознает правильные коллекции других токенов. (В этом смысле анализатор действительно выполняет и лексический анализ - преобразование потока байтов в поток токенов - и синтаксический анализ - преобразование потока токенов в абстрактное синтаксическое дерево.) – chepner