Просмотр полной версии : Создание собственного скриптого языка.
Решил написать на с++ свой скриптовый язык - переменные, циклы, иф-элс...
И вот сразу первая загвоздка... никак не могу определиться с правильным типом хранения переменных. Была идея хранить переменные в string массиве:
string test[3];
test[0] = "varname|varcontent";
test[1] = "varname|varcontent";
test[2] = "varname|varcontent";
типо такого...
пока решил остановиться на нем...
Хотелось бы услышать советы знающих людей)
Заранее спасибо)
Хеш-таблица, в stl - мапа (map)...
Хештаблица ?
Хеш-таблица, в stl - мапа (map)...
хмм, интерестно, спасибо за информацию) буду ковырять в этом направлении позже отпишусь что из этого вышло)
Подскажите пожалуйста эти библиотеки
#include <fstream>
#include <map>
#include <string>
#include <sstream>
кроссплатформенные?
Тоесть, они будут работать как на виндовсе так и на линуксе?
Заранее спасибо)
Подскажите пожалуйста эти библиотеки
#include <fstream>
#include <map>
#include <string>
#include <sstream>
кроссплатформенные?
Тоесть, они будут работать как на виндовсе так и на линуксе?
Заранее спасибо)
Да.
Хештаблица ? +1, только для каждого уровня видимости - своя.
+1, только для каждого уровня видимости - своя.
Неа, так долго будет искать. Лучше хештаблица стеков.
Возвращаюсь обратно к своему яп... =]
Пишу всё с нуля, пока что готово: грамматика и парсер.
Интересует след., после анализа парсером входящего текста(кода), что лучше, создавать дерево и после пробегать по нему и вычислять всё на лету, или как у "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 и т.д.
Смело начинать без теории. Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.
Flex, Bison (более древняя связка lex, yacc) +1. Спирит бустовский не советую из-за его рантаймовости.
Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.
Он имел ввиду, что ТС поступил очень смело
так в этих книжках как-раз и рассматривается построение "синтаксического дерева".
И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.
Спасибо, почитаемс)
зачем изобретать велосипед? ))
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 грамматикой, вот пример грамматики простых выраженийexpression = assignment_expression (',' assignment_expression)*;
assignment_expression = (unary_expression '=')[assign]* additive_expression;
additive_expression = multiplicative_expression (('+' | '-') multiplicative_expression)[additive]*;
multiplicative_expression = unary_expression (('*' | '/' | '%') unary_expression)[multiplicative]*;
unary_expression = (('+' | '-') unary_expression | postfix_expression);
postfix_expression = NAME[identifier] | NUM[number] | '(' expression ')';
Всё что в квадратных скобках, это как в boost::spirit semantic actions.
Если скормить эту грамматику boost::spirit и дать ему выражениеa+b*cто на выходе получим:
identifier a
identifier b
identifier c
multiplication
additionт.е. постфиксную запись, тут проблем нету, с этим все понятно.
Но!, если дать следующееd=a+b*cвывод будет таким:identifier d
assign
identifier a
identifier a
identifier b
identifier c
multiplication
addition
т.е. повторяющийся идентификатор 'a', конечно если записать грамматику присваивания такassignment_expression = additive_expression ('=' additive_expression)[assign]*;то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='.
Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо.
з.ы. то-что спирит не обращайте внимания, он у меня всего-лишь как эталон, т.е. проверяю на корректность свой парсер сравнивая результаты с спиритом)))
С предыдущей проблемой так и не смог разобраться, думаю пока чем проще тем лучше, а потом уже все отшлифую т.е. вопрос закрыт.
Как и обещал, вот исходники AIL (http://www.sendspace.com/file/id2vsq)
http://www.sendspace.com/file/id2vsq, готово след.:
Лексер и парсер - который парсит используя ebnf грамматику, которая прилагается в архиве-это скорее-всего финальная версия, т.е. синтаксис интерпретатора будет(опять-же скорее-всего) основан на этой грамматике.
Конечно, дохрена чего не оптимизировано + не везде комментарии расставлены, но это исправится со временем.
Любая критика и поправки приветствуются! :)
Например если записать в code.txt след.def main (argc, argv[]) {
print('Hello World!');
return 0;
}то на выходе получимfunc_def
func_body
return
return_expr
const_number
0
func_call_expr
arg_expr
const_string
Hello World!
name
print
params_expr
param_expr
array_subscript_expr
name
argv
param_expr
name
argc
name
mainзатем из всего этого(постфиксная запись) создается(пока ещё не реализовано) абстрактное синтаксическое дерево, которое будет выглядеть вот такhttp://s60.radikal.ru/i170/1005/69/9d26e80fd4a4t.jpg (http://radikal.ru/F/s60.radikal.ru/i170/1005/69/9d26e80fd4a4.png.html)
Осталось доделать:
семантический анализатор, модуль исполнения кода.
з.ы. Модераторам - можно-ли переименовать тему на "Создание интерпретатора AIL"?
а смысл? изобретаем велосипеды?
а смысл? изобретаем велосипеды?
Для опыта, да и наверняка у многих было желание написать свой яп))
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot