PDA

Просмотр полной версии : Создание собственного скриптого языка.


rudvil
21.02.2009, 22:14
Решил написать на с++ свой скриптовый язык - переменные, циклы, иф-элс...
И вот сразу первая загвоздка... никак не могу определиться с правильным типом хранения переменных. Была идея хранить переменные в string массиве:

string test[3];
test[0] = "varname|varcontent";
test[1] = "varname|varcontent";
test[2] = "varname|varcontent";
типо такого...

пока решил остановиться на нем...
Хотелось бы услышать советы знающих людей)
Заранее спасибо)

Algol
21.02.2009, 22:42
Хештаблица ?

desTiny
21.02.2009, 22:57
Хеш-таблица, в stl - мапа (map)...

rudvil
21.02.2009, 23:01
Хештаблица ?
Хеш-таблица, в stl - мапа (map)...
хмм, интерестно, спасибо за информацию) буду ковырять в этом направлении позже отпишусь что из этого вышло)

rudvil
08.03.2009, 01:26
Подскажите пожалуйста эти библиотеки

#include <fstream>
#include <map>
#include <string>
#include <sstream>

кроссплатформенные?

Тоесть, они будут работать как на виндовсе так и на линуксе?
Заранее спасибо)

Forcer
08.03.2009, 01:37
Подскажите пожалуйста эти библиотеки

#include <fstream>
#include <map>
#include <string>
#include <sstream>

кроссплатформенные?

Тоесть, они будут работать как на виндовсе так и на линуксе?
Заранее спасибо)
Да.

nerezus
08.03.2009, 02:05
Хештаблица ? +1, только для каждого уровня видимости - своя.

Algol
08.03.2009, 18:44
+1, только для каждого уровня видимости - своя.
Неа, так долго будет искать. Лучше хештаблица стеков.

rudvil
01.03.2010, 15:11
Возвращаюсь обратно к своему яп... =]
Пишу всё с нуля, пока что готово: грамматика и парсер.
Интересует след., после анализа парсером входящего текста(кода), что лучше, создавать дерево и после пробегать по нему и вычислять всё на лету, или как у "boost::spirit - пример - mini_c" что-то типа оп-кодов, как я понял это уже в сторону java, байт-код итд...

_antony
01.03.2010, 15:38
Смело начинать без теории.
Могу посоветовать Хантера почитать( основные концепции компиляторов )
Залогова (разработка паскаль компилятора ).

rudvil
01.03.2010, 16:28
Смело начинать без теории.
Могу посоветовать Хантера почитать( основные концепции компиляторов )
Залогова (разработка паскаль компилятора ).
Основы я более-менее знаю, спасибо за книжки, но меня интересует какраз-таки не компиляция, а интерпретация... т.е. не транслировать в низко-уровневый язык и оптимизировать его... а выполнять все на "лету".
Вот, сижу - не могу определиться что выбрать: байт код как у явы... или-же дерево и последующий прогон по нему.
з.ы. я понимаю что байт код не совсем на так уж "на лету"

_antony
01.03.2010, 16:54
так в этих книжках как-раз и рассматривается построение "синтаксического дерева".
И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.

Gar|k
01.03.2010, 23:51
зачем изобретать велосипед? ))

Flex, Bison (более древняя связка lex, yacc)

почитай по теме (сам на курсовик писал интерпретатор на php. Стыдно выкладывать там что-то типа exec($code); хехе )

http://www.gamedev.ru/community/toolcorner/articles/UniScript

http://www.gamedev.ru/code/articles/?id=4229 - вот тут по работе с lex и т.д.

nerezus
04.03.2010, 01:55
Смело начинать без теории. Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.

Flex, Bison (более древняя связка lex, yacc) +1. Спирит бустовский не советую из-за его рантаймовости.

desTiny
04.03.2010, 02:31
Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.
Он имел ввиду, что ТС поступил очень смело

rudvil
04.03.2010, 13:30
так в этих книжках как-раз и рассматривается построение "синтаксического дерева".
И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.
Спасибо, почитаемс)
зачем изобретать велосипед? ))

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. Спирит бустовский не советую из-за его рантаймовости.
от него я сразу отказался, слишком навороченный и дико долго компилит...

Вообщем, остановился я на дереве.. немного подкомментирую и почищу код , затем выложу его сюда =]

rudvil
14.05.2010, 14:02
Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с 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]*;то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='.
Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо.

з.ы. то-что спирит не обращайте внимания, он у меня всего-лишь как эталон, т.е. проверяю на корректность свой парсер сравнивая результаты с спиритом)))

rudvil
18.05.2010, 14:22
С предыдущей проблемой так и не смог разобраться, думаю пока чем проще тем лучше, а потом уже все отшлифую т.е. вопрос закрыт.

Как и обещал, вот исходники 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"?

SergSob
18.05.2010, 15:22
а смысл? изобретаем велосипеды?

rudvil
19.05.2010, 11:20
а смысл? изобретаем велосипеды?
Для опыта, да и наверняка у многих было желание написать свой яп))