- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
import re
lines = open('gldef.in','r')
for line in lines:
print line.replace("BEGIN ","").replace("END","").replace("PREFIX","exp").replace("SECOND","STDCALL") + " {"
#print "{"
args = ""
first = True
for arg in line[line.index("(")+1:line.index(")")].split(", "):
if(arg != "void"):
argsplit = re.split(' |\*', arg)
#print argsplit[-1]
if(not(first)):
args = args + ", "
first = False
args = args + argsplit[-1]
returnstr = "" if (line.split(' ')[1] == "void") else "return "
print " "*4+returnstr+line[line.index("PREFIX")+6:line.index("(")+1] + args + ");"
print "}"
print ""
dxd 19.08.2015 07:16 # 0
mittorn 22.08.2015 15:01 # 0
Хотя я полагаю, что всё можно было сделать на re в одну.
3_14dar 20.08.2015 03:23 # 0
guest 21.08.2015 12:44 # 0
3_14dar 21.08.2015 16:34 # 0
1024-- 22.08.2015 00:00 # 0
3_14dar, иди напитон, пидар!
3_14dar 22.08.2015 05:14 # 0
guest 28.08.2015 20:53 # 0
guest 29.08.2015 19:34 # 0
А как гостю по-другому послать 3_14darа напитон? ЛишпГумно всего-лишь багминотный акк. Он и до этого писал. Такому олдфагу стыдно не знать.
Xom94ok 22.08.2015 03:50 # +1
bormand 22.08.2015 23:47 # 0
kegdan 23.08.2015 04:32 # 0
3_14dar 23.08.2015 05:34 # 0
kegdan 23.08.2015 08:45 # 0
3_14dar 23.08.2015 23:18 # 0
bormand 22.08.2015 23:41 # 0
bormand 23.08.2015 00:02 # 0
mittorn 23.08.2015 11:35 # 0
mittorn 23.08.2015 11:35 # 0
Я полагаю, что в wine это тоже есть.
3_14dar 23.08.2015 18:29 # 0
kegdan 23.08.2015 19:52 # 0
3_14dar 23.08.2015 21:51 # 0
kegdan 23.08.2015 22:26 # 0
Гдеж ты видел калькулятор с арифметическими операциями?!
инфикс или префикс, приоритет операций? Ну и полный список операций пожалуйста
3_14dar 23.08.2015 22:29 # 0
Xom94ok 23.08.2015 22:35 # 0
Xom94ok 23.08.2015 23:30 # 0
как-то так
http://pastebin.com/BbRWSiQw
3_14dar 23.08.2015 23:49 # 0
Xom94ok 24.08.2015 00:24 # 0
Dummy - просто пустой класс, чтобы в него можно был запихнуть свойство val, хотя, в этом примере можно было и без него - просто значение запихивать в p[0].
Комментировать и читать это не надо, код врайт-онли, лучше статейку на жаброжабре и документацию к ply почитать, запогодя осилив первые четыре главы драгонбука.
3_14dar 24.08.2015 00:27 # 0
> код врайт-онли,
Уже понял.
>первые четыре главы драгонбука.
Што это?
А чего-нибудь попроще для понимания нет? Выше подбросили pyparsing
Xom94ok 24.08.2015 01:21 # 0
Драгонбук - это "книга дракона", пособие по написанию компиляторов; её рекомендуют в первую очередь, если кто-то хочет написать компилятор или интерпретатор. А первые четыре главы посвящены лексическому и синтаксическому анализу и их, в общем-то, почти достаточно для построения простого интерпретатора какого-нибудь языка.
> чего-нибудь попроще для понимания нет? Выше подбросили pyparsing
Не знаю, я не пишу на парсеры питоне :) Просто как-то возникла необходимость и я начал шерстить по интернету в поисках простых библиотек для написания парсеров по грамматике. Вроде бы, я натыкался уже на pyparsing, но сделал выбор в пользу ply, потому что она:
- генерирует lalr-парсер, т.е. может работать с большим количеством грамматик;
- описание грамматики и действий СУТ для ply естественнее, нежели у аналогов.
3_14dar 24.08.2015 18:26 # 0
bormand 24.08.2015 20:44 # +2
Приехали. Т.е. если ты что-то не проходил в институте, то это навсегда останется за пределами твоего понимания?
И этот человек ещё ругает унылую рашкинскую систему образования...
3_14dar 25.08.2015 00:04 # 0
bormand 25.08.2015 05:54 # 0
Да там не всё так страшно в этих парсерах...
Если кратко - есть 2 фазы: лексер и сам парсер. И есть 2 типа сущностей - terminals (токены, по сути) и non-terminals (более сложные конструкции из терминалов и нетерминалов).
На первой фазе ты пишешь пачку регулярок, которые будут ловить токены. И, если надо, немножко кода для вычисления семантического значения токена (число спарсить и т.п.)
Вторая фаза на входе получает эти нетерминалы и пытается склеить их по правилам. Правила пишешь в духе expr = num op num | num - т.е. Выражение это число оператор и число или просто число. Где num и op - либо терминалы с первой фазы, либо правила из второй (рекурсия тоже работает, да). Когда парсер заматчил правило, он вызывает соотв. ему semantic action - функцию, в которой ты клеишь дерево, считаешь выражения и т.п.
Т.е. для 100500+42 первая фаза сгенерит, к примеру, num(100500), op(+), num(42). А на второй мы найдем правило expr = num op num экшн которого получит те три значения и вернет, к примеру, 100542.
bormand 25.08.2015 05:57 # 0
А вообще - вся эта хуйня поддерживается намного проще, чем быдлопарсинг на свичах и регулярках.
roman-kashitsyn 25.08.2015 11:31 # 0
kegdan 25.08.2015 13:35 # 0
Другое дело то, что для того что бы излить язык на бнф нужно нихило напрячь мозг, продумать все варианты, понять нахуя ты вообще это пишешь и какие фичи нужны, а какие нет. (собственно большинство новых языков и загибиются на фазе - нахуй нам еще один #{имя_языка} ?)
Собственно нам дали на первой же паре задание принести через неделю бнф языка с которым мы будем работать.
roman-kashitsyn 25.08.2015 13:52 # 0
Я имел в виду именно если ты умеешь излагать нетривиальные грамматики в BNF. Даже для простого калькулятора мозг напрягать нужно, чтобы приоритеты соблюсти.
kegdan 25.08.2015 14:33 # 0
Ну да, там типа для операций одного приоритета свой порождающий нетерминальный символ, который не может породить нетерминал более низкого приоритета, дабы в AST операции высокого уровня были ниже (ближе к листьям) и выполнялись, соответственно, раньше
3_14dar 25.08.2015 21:20 # 0
kegdan 25.08.2015 21:27 # 0
3_14dar 25.08.2015 22:45 # 0
3_14dar 24.08.2015 00:08 # 0
bormand 24.08.2015 20:48 # 0
Xom94ok 24.08.2015 20:53 # +1
bormand 24.08.2015 20:56 # 0
kegdan 23.08.2015 22:36 # 0
3_14dar 23.08.2015 23:17 # 0
kegdan 23.08.2015 23:19 # 0
3_14dar 23.08.2015 23:42 # 0
kegdan 24.08.2015 00:32 # 0
3_14dar 24.08.2015 00:44 # 0
Только чтобы парсило корректно.
kegdan 24.08.2015 00:51 # 0
А ты какой-то модуль отрыл для этого
У тебя какая конечная цель?
3_14dar 24.08.2015 01:00 # 0
kegdan 24.08.2015 01:07 # 0
и калькулятор - имно не та задача. Нужно писать простенький, но именно язык, императивный, что нибудь банальное - присвоение, пару мат. операций простые функции. у тебя появятся совсем другие проблемы, нежели при написании калькулятора. А потом можно и развить. И Оптимизацию посмотреть
3_14dar 24.08.2015 01:33 # 0
вот тебе и калькулятор (ну кроме скобок)
guest 29.08.2015 19:31 # 0
bormand 23.08.2015 21:11 # 0
kegdan 23.08.2015 21:48 # 0
Судя по вопросам товарища из области создания языков - он хочет свой эвал с инфексной нотацией и приритетами операторов
3_14dar 23.08.2015 21:52 # 0
Почитал я пару статей, ну предположим ast мы построить можем, а дальше что?
1024-- 23.08.2015 23:21 # 0
Дальше надо что-нибудь делать, не?
Скажем, варианты:
1. Рекурсивно посчитать выражение
2. Рекурсивно посчитать выражение, используя свой длинный стек
3. Преобразовать в набор команд и прогнать на каком-нибудь интерпретаторе
3_14dar 23.08.2015 23:42 # 0
Кэп, что бы я без тебя делал.
1024-- 24.08.2015 10:09 # 0
3_14dar 24.08.2015 17:17 # 0
bormand 24.08.2015 17:32 # 0
Да ну. Парсить всё-таки сложнее, чем тупо дёрнуть тупейшую рекурсивную функцию на корне AST.
Варианты со стеком и байткодом тоже элементарные, на самом деле. Но посложнее рекурсии, да.
1024-- 24.08.2015 17:37 # 0
bormand 24.08.2015 17:38 # 0
operator, блджад!
roman-kashitsyn 24.08.2015 10:50 # +1
bormand 24.08.2015 17:34 # 0
Число/переменная - пушим.
Оператор - исполняем из стека все операторы, которые выше приоритетом и пушим.
Открывающая скобка - пушим.
Закрывающая скобка - исполняем из стека все операторы до открывающей.
Ну и в начале и в конце выражения добавить по скобке, чтобы не париться.
kegdan 24.08.2015 17:46 # 0
калькулятор - изи. такое можно на собеседовании давать
bormand 24.08.2015 17:48 # 0
Для собеседования и попроще задачки есть: найти среднее арифметическое джвух целых чисел со знаком на c/c++.
kegdan 24.08.2015 17:50 # 0
3_14dar 24.08.2015 18:24 # 0
bormand 24.08.2015 21:21 # 0
Ну смотря куда. Если чел будет писать системщину на сишке, то представление про ub, переполнения, платформозависимость размеров и т.п. явно лишним не будет.
kegdan 24.08.2015 21:34 # 0
Не понимаю людей, которые говорят - да пох, вот у меня есть мой любимый (выберете язык или инструмент), и я зарабатывают на хлеб с маслом, а до всего остального дела мне нет.
Так и мхом можно порасти
bormand 24.08.2015 21:56 # +2
Не факт. Низкий уровень далеко не всем интересен и нужен. Интересных вещей и на высоком хватает.
kegdan 24.08.2015 22:05 # 0
bormand 24.08.2015 22:13 # 0
Т.е. теперь магия - это всё, что ниже асма? ;)
kegdan 24.08.2015 22:18 # 0
bormand 24.08.2015 22:41 # 0
kegdan 24.08.2015 22:57 # 0
3_14dar 24.08.2015 23:23 # +2
Вот и байтоебство где-то так.
3_14dar 24.08.2015 23:21 # 0
Я тоже когда-то видел асм и даже пару команд помню. Но если о нем спросят на собеседовании - я ничего путного не отвечу.
bormand 25.08.2015 06:01 # 0
3_14dar 25.08.2015 21:16 # 0
CHayT 25.08.2015 22:08 # 0
да, от программистов, не осиливших BNF, действительно многие руку ко лбу пригладывают
3_14dar 25.08.2015 22:42 # 0
roman-kashitsyn 26.08.2015 09:58 # 0
Кнут TeX написал без знания "ООП" и "архитектуры", до сих пор все руки прикладывают, ага.
CHayT 26.08.2015 10:21 # 0
скопипастил из GoF пару фабрик визиторов, и, типа, тоже код пишешь
kegdan 26.08.2015 11:18 # 0
2 кофе и торт этому человеку
roman-kashitsyn 26.08.2015 11:26 # 0
А сам совсем недавно защищал паттерны
kegdan 26.08.2015 11:36 # +1
полтора года назад. С тех пор я увидел людей, которые ничего, кроме паттернов не знали. Ну, скорее они не знали. а думали что знают
1024-- 26.08.2015 12:31 # 0
3_14dar 26.08.2015 17:34 # +1
bormand 24.08.2015 22:03 # +1
kegdan 24.08.2015 22:11 # 0
3_14dar 24.08.2015 23:22 # 0
bormand 25.08.2015 06:02 # 0
3_14dar 25.08.2015 22:43 # 0
bormand 26.08.2015 05:23 # 0
CHayT 26.08.2015 08:29 # +1
> в асечке
ловите альфача
kegdan 26.08.2015 11:09 # 0
bormand 26.08.2015 17:28 # 0
Ты имеешь в виду дорогу от дома до работы или магазина? Я бы не рискнул там обсуждать конец евангелиона...
kegdan 26.08.2015 18:51 # 0
3_14dar 26.08.2015 17:33 # 0
bormand 26.08.2015 17:44 # 0
Нет, только тульпы.
3_14dar 26.08.2015 17:51 # 0
bormand 26.08.2015 18:18 # 0
Лёгкая форма шизофрении, при которой ты можешь общаться с виртуальной личностью.
> анимесловечко
Ты же вроде с борд пришёл, а про тульп не слышал...
3_14dar 26.08.2015 18:53 # 0
У тебя на самом деле есть общение, просто пока оно есть, ты его не замечаешь. А в эмиграции ты бы так не прожил.
bormand 26.08.2015 19:00 # +1
У вас там аська не работает?
3_14dar 26.08.2015 19:33 # 0
bormand 26.08.2015 19:37 # 0
Да с теми же самыми людьми. Я большинство из них лично очень-очень-очень редко вижу... Разные города всё-таки.
kegdan 26.08.2015 19:00 # 0
kegdan 26.08.2015 18:55 # 0
Говнокод - явно не твое
Это шаманизм (и в восточной мифологии тоже что то такое есть) - часть твоей души, которое материализуется в виде живого существа - с ним можно разговаривать, советоваться, играть, и даже сношаться (в этой фазе скорее всего тульпа тебя заборет и ты сдохнешь). Правда это все черевато - например попаданием в адЪ
3_14dar 26.08.2015 18:59 # 0
Говнокод - явно не твое
ПНХ, анимешник. Вали на анимешные сайты, а говнокод как раз не твое.
kegdan 26.08.2015 19:01 # 0
Я не анимешник, лалка
bormand 26.08.2015 19:04 # 0
Один раз - не анимас?
kegdan 26.08.2015 19:07 # +2
bormand 26.08.2015 19:19 # +1
Фу, ньюфажина 15-тайтловая.
1024-- 26.08.2015 19:20 # 0
bormand 26.08.2015 19:21 # 0
Ну да, часами тоже. А то вдруг чел насмотрел 1000 OVA'шек по полчаса каждая вместо того, чтобы честно смотреть сериалы по 12+ серий.
kegdan 26.08.2015 19:28 # 0
bormand 26.08.2015 19:32 # 0
Там, на самом деле, никто не знает, как правильно считать. Вроде если 6 ов на одном диске вышло - это один тайтл. А если по-отдельности в разное время - 6.
P.S. Кого ебут эти счётчики? Ну кроме счётчика проёбанного на аниму времени в часах.
kegdan 26.08.2015 19:39 # 0
Это то, что я вспомнил минус Миядзаки
Ну и еще игруля "Бесконечно лето"... ^_^
bormand 26.08.2015 19:54 # 0
0x100? 256?
kegdan 26.08.2015 19:58 # 0
inkanus-gray 26.08.2015 20:01 # 0
kegdan 26.08.2015 20:01 # 0
inkanus-gray 26.08.2015 20:05 # 0
https://archive.is/uMjEY
kegdan 26.08.2015 20:09 # 0
inkanus-gray 26.08.2015 20:11 # 0
http://i.imgur.com/wbG7iWU.jpg
bormand 26.08.2015 20:13 # +1
Да MBR хуйня. Его на автомате вылечить можно, даже не вникая в суть проблемы. Всё-таки хакеры добрые были, раз только MBR запороли.
kegdan 26.08.2015 20:15 # +2
3_14dar 26.08.2015 21:46 # 0
kegdan 26.08.2015 21:51 # 0
CHayT 26.08.2015 22:01 # 0
Stallman 26.08.2015 22:40 # 0
3_14dar 27.08.2015 00:31 # 0
inkanus-gray 27.08.2015 00:40 # 0
А тут раздавали какие-то диски. Не продавали, заметь! Т. е. придраться к тому, что нарушили правила торговли, невозможно. Акта купли-продажи нет.
bormand 27.08.2015 05:39 # 0
Но тут людям заяву писать неприятно. Получается примерно как "я пошел к шалаве, а у нее оказался сифилис, сделайте с ней что-нибудь".
Но чуваки пиздец рисковали, раздавая диски - могут же и в обход закона морду набить.
bormand 26.08.2015 21:51 # 0
"Заявление. На фестивале анимешников мне дали бесплатный диск с порноквестом, я его воткнул в комп и всё наебнулось."
P.S. А в бесконечном лете случаем не про школьниц история?
kegdan 26.08.2015 21:53 # 0
Нет, не случайно. Про пионерский лагерь
Stallman 26.08.2015 22:41 # 0
CHayT 26.08.2015 20:26 # +1
Фу блядь, фу нахуй
Stallman 26.08.2015 22:43 # 0
Stallman 26.08.2015 22:44 # 0
kegdan 26.08.2015 22:47 # 0
Stallman 26.08.2015 23:08 # 0
bormand 27.08.2015 05:44 # 0
Stallman 27.08.2015 10:47 # 0
3_14dar 24.08.2015 23:20 # 0
Байтоебство интересно? Школьник в треде.
3_14dar 24.08.2015 23:19 # 0
3_14dar 24.08.2015 18:25 # 0
kegdan 24.08.2015 18:30 # 0
Борманд все отлично объяснил
http://govnokod.ru/18610#comment296532
Если есть вопросы - спрашивай. + у тебя есть код на питоне и на хаски
3_14dar 24.08.2015 23:25 # 0
bormand 24.08.2015 18:59 # 0
Если хочешь парсить полноценный язык хотя бы уровня паскаля - тебе придётся подобного монстра юзать. Вариантов особо нет.
kegdan 24.08.2015 19:17 # 0
bormand 24.08.2015 20:37 # 0
В них, емнип, даже операторы с разными приоритетами/ассоциативностью и конструкции, требующие look ahead, в духе if (x) { ... } и if (x) { ... } else { ...} пилятся только через жопу и костыли.
kegdan 24.08.2015 20:43 # 0
if (x) { ... } - when(х) { ... }
Все лишь бы не лукахедить
bormand 24.08.2015 20:46 # 0
kegdan 24.08.2015 20:55 # 0
Но в конце взлетело - даже сортировку пирамидальную на этом языке написали и оно работало (мы в командах делали - по факту - вдвоем)
3_14dar 24.08.2015 23:26 # 0
kegdan 24.08.2015 23:28 # 0
3_14dar 24.08.2015 23:56 # 0
kegdan 24.08.2015 23:58 # 0
3_14dar 25.08.2015 00:05 # 0
kegdan 25.08.2015 00:14 # 0
3_14dar 25.08.2015 00:44 # 0
kegdan 25.08.2015 05:28 # 0
Это поэтому ты калькулятор не можешь написать?
3_14dar 25.08.2015 05:46 # 0
kegdan 25.08.2015 06:27 # 0
Давай, пиши прогу, которая делит входную строку на токены, потом будем модернизировать.
3_14dar 25.08.2015 21:04 # 0
kegdan 25.08.2015 21:05 # 0
3_14dar 25.08.2015 21:14 # 0
kegdan 25.08.2015 21:17 # 0
Тебе уже все разжевали и в тор положили, даже по горлу полгадили - или делай или кончай кудахтать
3_14dar 25.08.2015 22:44 # 0
1024-- 25.08.2015 12:26 # 0
Баги начинаются, когда калькулятор доходит до функций (отличить локальные переменные от глобальных, отличить именованные аргументы от переменных) и императивной питушни (например, какое значение переменной использовать в функции), а до этого пока далеко.
Питушню вроде левой рекурсии можно и тестами покрыть.
Так что лучше писать калькулятор, а не косплеить wct-пророка и ждать, пока по реке поплывут исходные коды твоих программ.
CHayT 24.08.2015 22:24 # 0
CHayT 25.08.2015 15:45 # 0
не знаю, в чём bormand узрел проблемы
хотя, конечно, никто в здравом уме на parsec писать не будет
CHayT 25.08.2015 17:00 # 0
bormand 25.08.2015 17:13 # 0
В парсинге императивного if'а без else.
CHayT 25.08.2015 17:31 # 0
bormand 25.08.2015 17:53 # 0
CHayT 25.08.2015 19:29 # +1
option -- просто маленькая надстройка над этим хозяйством
в attoparsec так даже try не нужен, вообще красота
3_14dar 24.08.2015 23:24 # 0
guest 29.08.2015 19:49 # 0
3_14dar, иди напитон, пидар!
3_14dar 29.08.2015 20:12 # 0
kegdan 29.08.2015 20:24 # 0
3_14dar 29.08.2015 20:31 # 0
CHayT 24.08.2015 22:35 # 0
1024-- 25.08.2015 12:11 # +2
"строить дома с крыши" - лишнее, т.к. нелогичное
3_14dar 25.08.2015 21:05 # 0
Vindicar 24.08.2015 11:00 # 0
Ну вот тебе и безопасный эвал =D
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
3_14dar 24.08.2015 17:16 # 0
kegdan 24.08.2015 10:24 # 0
http://ideone.com/ulecjW
надо еще в мейби завернуть, но лень