Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Создание собственного скриптого языка. (https://forum.antichat.xyz/showthread.php?t=107383)

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

Цитата:

Сообщение от Algol
Хештаблица ?

Цитата:

Сообщение от desTiny
Хеш-таблица, в stl - мапа (map)...

хмм, интерестно, спасибо за информацию) буду ковырять в этом направлении позже отпишусь что из этого вышло)

rudvil 08.03.2009 01:26

Подскажите пожалуйста эти библиотеки
Код:

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

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

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

Forcer 08.03.2009 01:37

Цитата:

Сообщение от rudvil
Подскажите пожалуйста эти библиотеки
Код:

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

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

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

Да.

nerezus 08.03.2009 02:05

Цитата:

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

Algol 08.03.2009 18:44

Цитата:

Сообщение от nerezus
+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
Смело начинать без теории.
Могу посоветовать Хантера почитать( основные концепции компиляторов )
Залогова (разработка паскаль компилятора ).

Основы я более-менее знаю, спасибо за книжки, но меня интересует какраз-таки не компиляция, а интерпретация... т.е. не транслировать в низко-уровневый язык и оптимизировать его... а выполнять все на "лету".
Вот, сижу - не могу определиться что выбрать: байт код как у явы... или-же дерево и последующий прогон по нему.
з.ы. я понимаю что байт код не совсем на так уж "на лету"

_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

Цитата:

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

Он имел ввиду, что ТС поступил очень смело

rudvil 04.03.2010 13:30

Цитата:

Сообщение от _antony
так в этих книжках как-раз и рассматривается построение "синтаксического дерева".
И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.

Спасибо, почитаемс)
Цитата:

Сообщение от Gar|k
зачем изобретать велосипед? ))

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
+1. Спирит бустовский не советую из-за его рантаймовости.

от него я сразу отказался, слишком навороченный и дико долго компилит...

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

rudvil 14.05.2010 14:02

Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с ebnf грамматикой, вот пример грамматики простых выражений
Цитата:

Сообщение от grammar
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 и дать ему выражение
Цитата:

Сообщение от input
a+b*c

то на выходе получим:
Цитата:

Сообщение от boost::spirit
identifier a
identifier b
identifier c
multiplication
addition

т.е. постфиксную запись, тут проблем нету, с этим все понятно.
Но!, если дать следующее
Цитата:

Сообщение от input
d=a+b*c

вывод будет таким:
Цитата:

Сообщение от boost::spirit
identifier d
assign
identifier a
identifier a
identifier b
identifier c
multiplication
addition

т.е. повторяющийся идентификатор 'a', конечно если записать грамматику присваивания так
Цитата:

Сообщение от grammar
assignment_expression = additive_expression ('=' additive_expression)[assign]*;

то повторений не будет, но тогда мы теряем правоассоциацивность(как-то так пишется, но это неважно - смысл я понимаю) оператора присваивания '='.
Собственно непонятно, эти повторения это нормально? или нужно искать другой выход из ситуации? спасибо.

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

rudvil 18.05.2010 14:22

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

Как и обещал, вот исходники AIL
http://www.sendspace.com/file/id2vsq, готово след.:
Лексер и парсер - который парсит используя ebnf грамматику, которая прилагается в архиве-это скорее-всего финальная версия, т.е. синтаксис интерпретатора будет(опять-же скорее-всего) основан на этой грамматике.

Конечно, дохрена чего не оптимизировано + не везде комментарии расставлены, но это исправится со временем.
Любая критика и поправки приветствуются! :)

Например если записать в code.txt след.
Цитата:

Сообщение от code
def main (argc, argv[]) {
print('Hello World!');
return 0;
}

то на выходе получим
Цитата:

Сообщение от parser_output
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

Осталось доделать:
семантический анализатор, модуль исполнения кода.

з.ы. Модераторам - можно-ли переименовать тему на "Создание интерпретатора AIL"?

SergSob 18.05.2010 15:22

а смысл? изобретаем велосипеды?

rudvil 19.05.2010 11:20

Цитата:

Сообщение от SergSob
а смысл? изобретаем велосипеды?

Для опыта, да и наверняка у многих было желание написать свой яп))


Время: 19:52