Решил написать на с++ свой скриптовый язык - переменные, циклы, иф-элс... И вот сразу первая загвоздка... никак не могу определиться с правильным типом хранения переменных. Была идея хранить переменные в string массиве: Code: string test[3]; test[0] = "varname|varcontent"; test[1] = "varname|varcontent"; test[2] = "varname|varcontent"; типо такого... пока решил остановиться на нем... Хотелось бы услышать советы знающих людей) Заранее спасибо)
хмм, интерестно, спасибо за информацию) буду ковырять в этом направлении позже отпишусь что из этого вышло)
Подскажите пожалуйста эти библиотеки Code: #include <fstream> #include <map> #include <string> #include <sstream> кроссплатформенные? Тоесть, они будут работать как на виндовсе так и на линуксе? Заранее спасибо)
Возвращаюсь обратно к своему яп... =] Пишу всё с нуля, пока что готово: грамматика и парсер. Интересует след., после анализа парсером входящего текста(кода), что лучше, создавать дерево и после пробегать по нему и вычислять всё на лету, или как у "boost::spirit - пример - mini_c" что-то типа оп-кодов, как я понял это уже в сторону java, байт-код итд...
Смело начинать без теории. Могу посоветовать Хантера почитать( основные концепции компиляторов ) Залогова (разработка паскаль компилятора ).
Основы я более-менее знаю, спасибо за книжки, но меня интересует какраз-таки не компиляция, а интерпретация... т.е. не транслировать в низко-уровневый язык и оптимизировать его... а выполнять все на "лету". Вот, сижу - не могу определиться что выбрать: байт код как у явы... или-же дерево и последующий прогон по нему. з.ы. я понимаю что байт код не совсем на так уж "на лету"
так в этих книжках как-раз и рассматривается построение "синтаксического дерева". И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.
зачем изобретать велосипед? )) Flex, Bison (более древняя связка lex, yacc) почитай по теме (сам на курсовик писал интерпретатор на php. Стыдно выкладывать там что-то типа exec($code); хехе ) http://www.gamedev.ru/community/toolcorner/articles/UniScript http://www.gamedev.ru/code/articles/?id=4229 - вот тут по работе с lex и т.д.
Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать. +1. Спирит бустовский не советую из-за его рантаймовости.
Спасибо, почитаемс) Полностью согласен, но! это не какойнибуть коммерческий проект где нужно все качественное и проверенное... Я например пока писал с нуля грамматику и парсер много чего интерестного узнал), а если бы взял уже готовое, то даже и не подозревал-бы как там всё устроено... от него я сразу отказался, слишком навороченный и дико долго компилит... Вообщем, остановился я на дереве.. немного подкомментирую и почищу код , затем выложу его сюда =]
Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с ebnf грамматикой, вот пример грамматики простых выражений Всё что в квадратных скобках, это как в boost::spirit semantic actions. Если скормить эту грамматику boost::spirit и дать ему выражение то на выходе получим: т.е. постфиксную запись, тут проблем нету, с этим все понятно. Но!, если дать следующее вывод будет таким: т.е. повторяющийся идентификатор 'a', конечно если записать грамматику присваивания так то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='. Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо. з.ы. то-что спирит не обращайте внимания, он у меня всего-лишь как эталон, т.е. проверяю на корректность свой парсер сравнивая результаты с спиритом)))
С предыдущей проблемой так и не смог разобраться, думаю пока чем проще тем лучше, а потом уже все отшлифую т.е. вопрос закрыт. Как и обещал, вот исходники AIL http://www.sendspace.com/file/id2vsq, готово след.: Лексер и парсер - который парсит используя ebnf грамматику, которая прилагается в архиве-это скорее-всего финальная версия, т.е. синтаксис интерпретатора будет(опять-же скорее-всего) основан на этой грамматике. Конечно, дохрена чего не оптимизировано + не везде комментарии расставлены, но это исправится со временем. Любая критика и поправки приветствуются! Например если записать в code.txt след. то на выходе получим затем из всего этого(постфиксная запись) создается(пока ещё не реализовано) абстрактное синтаксическое дерево, которое будет выглядеть вот так Осталось доделать: семантический анализатор, модуль исполнения кода.