Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

01.03.2010, 16:28
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Сообщение от _antony
Смело начинать без теории.
Могу посоветовать Хантера почитать( основные концепции компиляторов )
Залогова (разработка паскаль компилятора ).
Основы я более-менее знаю, спасибо за книжки, но меня интересует какраз-таки не компиляция, а интерпретация... т.е. не транслировать в низко-уровневый язык и оптимизировать его... а выполнять все на "лету".
Вот, сижу - не могу определиться что выбрать: байт код как у явы... или-же дерево и последующий прогон по нему.
з.ы. я понимаю что байт код не совсем на так уж "на лету"
Последний раз редактировалось rudvil; 01.03.2010 в 16:31..
|
|
|

01.03.2010, 16:54
|
|
Познающий
Регистрация: 16.07.2008
Сообщений: 82
Провел на форуме: 424387
Репутация:
142
|
|
так в этих книжках как-раз и рассматривается построение "синтаксического дерева".
И про трансляцию я ничего не говорил. А вот синтаксический анализатор там рассмотрен.
|
|
|

01.03.2010, 23:51
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
зачем изобретать велосипед? ))
Flex, Bison (более древняя связка lex, yacc)
почитай по теме (сам на курсовик писал интерпретатор на php. Стыдно выкладывать там что-то типа exec($code); хехе )
http://www.gamedev.ru/community/toolcorner/articles/UniScript
http://www.gamedev.ru/code/articles/?id=4229 - вот тут по работе с lex и т.д.
Последний раз редактировалось Gar|k; 01.03.2010 в 23:54..
|
|
|

04.03.2010, 01:55
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Смело начинать без теории.
Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.
Flex, Bison (более древняя связка lex, yacc)
+1. Спирит бустовский не советую из-за его рантаймовости.
|
|
|

04.03.2010, 02:31
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от nerezus
Впизду такое счастье. Без теории в сугубо теоретической области кроме сосания машинного хуя ничего не сделать.
Он имел ввиду, что ТС поступил очень смело
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

04.03.2010, 13:30
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Сообщение от _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. Спирит бустовский не советую из-за его рантаймовости.
от него я сразу отказался, слишком навороченный и дико долго компилит...
Вообщем, остановился я на дереве.. немного подкомментирую и почищу код , затем выложу его сюда =]
|
|
|

14.05.2010, 14:02
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Есть маленькая непонятка с грамматикой(или это особенности парсера?), а именно с 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 и дать ему выражение
то на выходе получим:
Сообщение от 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; 14.05.2010 в 14:09..
|
|
|

18.05.2010, 14:22
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
С предыдущей проблемой так и не смог разобраться, думаю пока чем проще тем лучше, а потом уже все отшлифую т.е. вопрос закрыт.
Как и обещал, вот исходники 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
затем из всего этого(постфиксная запись) создается(пока ещё не реализовано) абстрактное синтаксическое дерево, которое будет выглядеть вот так
Осталось доделать:
семантический анализатор, модуль исполнения кода.
з.ы. Модераторам - можно-ли переименовать тему на "Создание интерпретатора AIL"?
Последний раз редактировалось rudvil; 19.05.2010 в 13:26..
|
|
|

18.05.2010, 15:22
|
|
Новичок
Регистрация: 20.04.2010
Сообщений: 7
Провел на форуме: 16699
Репутация:
0
|
|
а смысл? изобретаем велосипеды?
|
|
|

19.05.2010, 11:20
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Сообщение от SergSob
а смысл? изобретаем велосипеды?
Для опыта, да и наверняка у многих было желание написать свой яп))
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|