- 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 ""
Хотя я полагаю, что всё можно было сделать на re в одну.
3_14dar, иди напитон, пидар!
А как гостю по-другому послать 3_14darа напитон? ЛишпГумно всего-лишь багминотный акк. Он и до этого писал. Такому олдфагу стыдно не знать.
Я полагаю, что в wine это тоже есть.
Гдеж ты видел калькулятор с арифметическими операциями?!
инфикс или префикс, приоритет операций? Ну и полный список операций пожалуйста
как-то так
http://pastebin.com/BbRWSiQw
Dummy - просто пустой класс, чтобы в него можно был запихнуть свойство val, хотя, в этом примере можно было и без него - просто значение запихивать в p[0].
Комментировать и читать это не надо, код врайт-онли, лучше статейку на жаброжабре и документацию к ply почитать, запогодя осилив первые четыре главы драгонбука.
> код врайт-онли,
Уже понял.
>первые четыре главы драгонбука.
Што это?
А чего-нибудь попроще для понимания нет? Выше подбросили pyparsing
Драгонбук - это "книга дракона", пособие по написанию компиляторов; её рекомендуют в первую очередь, если кто-то хочет написать компилятор или интерпретатор. А первые четыре главы посвящены лексическому и синтаксическому анализу и их, в общем-то, почти достаточно для построения простого интерпретатора какого-нибудь языка.
> чего-нибудь попроще для понимания нет? Выше подбросили pyparsing
Не знаю, я не пишу на парсеры питоне :) Просто как-то возникла необходимость и я начал шерстить по интернету в поисках простых библиотек для написания парсеров по грамматике. Вроде бы, я натыкался уже на pyparsing, но сделал выбор в пользу ply, потому что она:
- генерирует lalr-парсер, т.е. может работать с большим количеством грамматик;
- описание грамматики и действий СУТ для ply естественнее, нежели у аналогов.
Приехали. Т.е. если ты что-то не проходил в институте, то это навсегда останется за пределами твоего понимания?
И этот человек ещё ругает унылую рашкинскую систему образования...
Да там не всё так страшно в этих парсерах...
Если кратко - есть 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.
А вообще - вся эта хуйня поддерживается намного проще, чем быдлопарсинг на свичах и регулярках.
Другое дело то, что для того что бы излить язык на бнф нужно нихило напрячь мозг, продумать все варианты, понять нахуя ты вообще это пишешь и какие фичи нужны, а какие нет. (собственно большинство новых языков и загибиются на фазе - нахуй нам еще один #{имя_языка} ?)
Собственно нам дали на первой же паре задание принести через неделю бнф языка с которым мы будем работать.
Я имел в виду именно если ты умеешь излагать нетривиальные грамматики в BNF. Даже для простого калькулятора мозг напрягать нужно, чтобы приоритеты соблюсти.
Ну да, там типа для операций одного приоритета свой порождающий нетерминальный символ, который не может породить нетерминал более низкого приоритета, дабы в AST операции высокого уровня были ниже (ближе к листьям) и выполнялись, соответственно, раньше
Только чтобы парсило корректно.
А ты какой-то модуль отрыл для этого
У тебя какая конечная цель?
и калькулятор - имно не та задача. Нужно писать простенький, но именно язык, императивный, что нибудь банальное - присвоение, пару мат. операций простые функции. у тебя появятся совсем другие проблемы, нежели при написании калькулятора. А потом можно и развить. И Оптимизацию посмотреть
вот тебе и калькулятор (ну кроме скобок)
Судя по вопросам товарища из области создания языков - он хочет свой эвал с инфексной нотацией и приритетами операторов
Почитал я пару статей, ну предположим ast мы построить можем, а дальше что?
Дальше надо что-нибудь делать, не?
Скажем, варианты:
1. Рекурсивно посчитать выражение
2. Рекурсивно посчитать выражение, используя свой длинный стек
3. Преобразовать в набор команд и прогнать на каком-нибудь интерпретаторе
Кэп, что бы я без тебя делал.
Да ну. Парсить всё-таки сложнее, чем тупо дёрнуть тупейшую рекурсивную функцию на корне AST.
Варианты со стеком и байткодом тоже элементарные, на самом деле. Но посложнее рекурсии, да.
operator, блджад!
Число/переменная - пушим.
Оператор - исполняем из стека все операторы, которые выше приоритетом и пушим.
Открывающая скобка - пушим.
Закрывающая скобка - исполняем из стека все операторы до открывающей.
Ну и в начале и в конце выражения добавить по скобке, чтобы не париться.
калькулятор - изи. такое можно на собеседовании давать
Для собеседования и попроще задачки есть: найти среднее арифметическое джвух целых чисел со знаком на c/c++.
Ну смотря куда. Если чел будет писать системщину на сишке, то представление про ub, переполнения, платформозависимость размеров и т.п. явно лишним не будет.
Не понимаю людей, которые говорят - да пох, вот у меня есть мой любимый (выберете язык или инструмент), и я зарабатывают на хлеб с маслом, а до всего остального дела мне нет.
Так и мхом можно порасти
Не факт. Низкий уровень далеко не всем интересен и нужен. Интересных вещей и на высоком хватает.
Т.е. теперь магия - это всё, что ниже асма? ;)
Вот и байтоебство где-то так.
Я тоже когда-то видел асм и даже пару команд помню. Но если о нем спросят на собеседовании - я ничего путного не отвечу.
да, от программистов, не осиливших BNF, действительно многие руку ко лбу пригладывают
Кнут TeX написал без знания "ООП" и "архитектуры", до сих пор все руки прикладывают, ага.
скопипастил из GoF пару фабрик визиторов, и, типа, тоже код пишешь
2 кофе и торт этому человеку
А сам совсем недавно защищал паттерны
полтора года назад. С тех пор я увидел людей, которые ничего, кроме паттернов не знали. Ну, скорее они не знали. а думали что знают
> в асечке
ловите альфача
Ты имеешь в виду дорогу от дома до работы или магазина? Я бы не рискнул там обсуждать конец евангелиона...
Нет, только тульпы.
Лёгкая форма шизофрении, при которой ты можешь общаться с виртуальной личностью.
> анимесловечко
Ты же вроде с борд пришёл, а про тульп не слышал...
У тебя на самом деле есть общение, просто пока оно есть, ты его не замечаешь. А в эмиграции ты бы так не прожил.
У вас там аська не работает?
Да с теми же самыми людьми. Я большинство из них лично очень-очень-очень редко вижу... Разные города всё-таки.
Говнокод - явно не твое
Это шаманизм (и в восточной мифологии тоже что то такое есть) - часть твоей души, которое материализуется в виде живого существа - с ним можно разговаривать, советоваться, играть, и даже сношаться (в этой фазе скорее всего тульпа тебя заборет и ты сдохнешь). Правда это все черевато - например попаданием в адЪ
Говнокод - явно не твое
ПНХ, анимешник. Вали на анимешные сайты, а говнокод как раз не твое.
Я не анимешник, лалка
Один раз - не анимас?
Фу, ньюфажина 15-тайтловая.
Ну да, часами тоже. А то вдруг чел насмотрел 1000 OVA'шек по полчаса каждая вместо того, чтобы честно смотреть сериалы по 12+ серий.
Там, на самом деле, никто не знает, как правильно считать. Вроде если 6 ов на одном диске вышло - это один тайтл. А если по-отдельности в разное время - 6.
P.S. Кого ебут эти счётчики? Ну кроме счётчика проёбанного на аниму времени в часах.
Это то, что я вспомнил минус Миядзаки
Ну и еще игруля "Бесконечно лето"... ^_^
0x100? 256?
https://archive.is/uMjEY
http://i.imgur.com/wbG7iWU.jpg
Да MBR хуйня. Его на автомате вылечить можно, даже не вникая в суть проблемы. Всё-таки хакеры добрые были, раз только MBR запороли.
А тут раздавали какие-то диски. Не продавали, заметь! Т. е. придраться к тому, что нарушили правила торговли, невозможно. Акта купли-продажи нет.
Но тут людям заяву писать неприятно. Получается примерно как "я пошел к шалаве, а у нее оказался сифилис, сделайте с ней что-нибудь".
Но чуваки пиздец рисковали, раздавая диски - могут же и в обход закона морду набить.
"Заявление. На фестивале анимешников мне дали бесплатный диск с порноквестом, я его воткнул в комп и всё наебнулось."
P.S. А в бесконечном лете случаем не про школьниц история?
Нет, не случайно. Про пионерский лагерь
Фу блядь, фу нахуй
Байтоебство интересно? Школьник в треде.
Борманд все отлично объяснил
http://govnokod.ru/18610#comment296532
Если есть вопросы - спрашивай. + у тебя есть код на питоне и на хаски
Если хочешь парсить полноценный язык хотя бы уровня паскаля - тебе придётся подобного монстра юзать. Вариантов особо нет.
В них, емнип, даже операторы с разными приоритетами/ассоциативностью и конструкции, требующие look ahead, в духе if (x) { ... } и if (x) { ... } else { ...} пилятся только через жопу и костыли.
if (x) { ... } - when(х) { ... }
Все лишь бы не лукахедить
Но в конце взлетело - даже сортировку пирамидальную на этом языке написали и оно работало (мы в командах делали - по факту - вдвоем)
Это поэтому ты калькулятор не можешь написать?
Давай, пиши прогу, которая делит входную строку на токены, потом будем модернизировать.
Тебе уже все разжевали и в тор положили, даже по горлу полгадили - или делай или кончай кудахтать
Баги начинаются, когда калькулятор доходит до функций (отличить локальные переменные от глобальных, отличить именованные аргументы от переменных) и императивной питушни (например, какое значение переменной использовать в функции), а до этого пока далеко.
Питушню вроде левой рекурсии можно и тестами покрыть.
Так что лучше писать калькулятор, а не косплеить wct-пророка и ждать, пока по реке поплывут исходные коды твоих программ.
не знаю, в чём bormand узрел проблемы
хотя, конечно, никто в здравом уме на parsec писать не будет
В парсинге императивного if'а без else.
option -- просто маленькая надстройка над этим хозяйством
в attoparsec так даже try не нужен, вообще красота
3_14dar, иди напитон, пидар!
"строить дома с крыши" - лишнее, т.к. нелогичное
Ну вот тебе и безопасный эвал =D
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
http://ideone.com/ulecjW
надо еще в мейби завернуть, но лень