Cheese
так ведь распарсить С++ без половины компилятора невозможно
IC
можно поофтопить? когда там следующий FProg SPb?
Maxim
вроде как в июне не будет, а в июле будет на ITGM
Maxim
я там спрашивал
Alex
Нашел гайд по мегапарсеку
Alex
http://akashagrawal.me/beginners-guide-to-megaparsec/
Alex
Я так понимаю, он уже устарел?
Alex
Ибо у меня вообще не компилится
Alex
Код оттуда
Alex
Ой
Alex
Не то
Alex
http://akashagrawal.me/beginners-guide-to-megaparsec/
Aleksei (astynax)
Принципиально там ничего не менялось с тех пор.
Aleksei (astynax)
https://markkarpov.com/learn-haskell.html#megaparsec-tutorials тут рекомендуемые автором мегапарсека туториалы
Aleksei (astynax)
Может что-то из этого будет работать :) Хотя там статьи ещё более старые судя по датам публикации
Aleksei (astynax)
> The tutorials here have been updated to be used with Megaparsec 6
Aleksei (astynax)
Вот это говорит нам, что материал должен быть плюс-минус актуальным
Alex
Подскажи пожалуйста, как обьявить тип Parser чтобы первый пример заработал?
Aleksei (astynax)
https://hackage.haskell.org/package/megaparsec-6.5.0/docs/Text-Megaparsec.html
Aleksei (astynax)
Прямо в начале доки
Aleksei (astynax)
Parser Void Char видимо
Alex
Действительно
Alex
Спасибо:)
Aleksei (astynax)
👍
Alex
cls :: Parser String cls = do many letterChar char '(' name <- many alphaNumChar
Alex
Джентельмены, подскажите в чем ошибка
Alex
The last statement in a 'do' block must be an expression name <- many alphaNumChar
Maxim
убери name <-
Leonid 🦇
Последняя строка должна быть без var <-
Maxim
зачем тебе это имя в любом случае?
Maxim
можно дописать return name в конце, но в этом все равно нет смысла
Alex
Мне нужно чтобы эта функция вернула то что запарсит последняя строка
Alex
Как это сделать?
Ю ли я? 🤔
А что за парсер такой с непарной скобкой?
Leonid 🦇
cls :: Parser String cls = do many letterChar char '(' many alphaNumChar
Alex
Ilya
Это промежуточная функция
может всё-таки взять готовый парсер плюсов?
Alex
А есть?
Ilya
ну сходу нашлись биндинги к клангу (http://hackage.haskell.org/package/LibClang) и чьё-то самописное на парсеке (https://hackage.haskell.org/package/cparsing)
Ilya
тебе прям нужно полноценно C++ парсить и рефакторить, или всё же задача проще?
Alex
Есть десятки тысяч строк кода месседжей. Случился рефакторинг и теперь они должны выглядеть иначе.
Alex
Было два пути
Alex
Либо всех их менять руками
Alex
Что больно, либо написать скрипт
Alex
Я решил писать на хаскеле, потому что хочется:)
Ilya
для простого рефакторинга не обязательно прям разбирать код по-настоящему, конечно
Ilya
так что те пакеты может и оверхед
Alex
У нас очень специфичный препроцессор
Alex
Думаю лучше будет распарсить руками
Aliester
головой
Alex
Сори за глупый вопрос
Alex
Как из IO string сделать String
Alex
Я просто в ghci гружу из файла
Maxim
в ghci a :: IO String при печати будет выведено как есть
Maxim
> a <- return "bla" :: IO String > a bla
Maxim
как-то так
Alex
Не, я его потом отправляю в функу которая ждет стринг
Alex
А
Alex
Я понял
Maxim
👍
Alex
Да
Alex
Я уж понял:)
Alex
Спасибо
Maxim
ну можно и fmap, но понятнее наверное к имени привязать
Alex
У меня такая фукнция
Alex
parseTest enum str
Alex
str это IO String
Alex
Где писать fmap
Ilya
Перед parseTest
Ilya
parseTest enum <$> str
Maxim
fmap (parseTest enum) str
Maxim
или как выше ^
Maxim
или s <- str parseTest enum s
Maxim
хоть мы и в хаскельном чате, а не в каком-то другом, все равно explicit is better than implicit
Maxim
по крайней мере в обучении
Alex
Парни
Alex
Спасибо