![]() |
Парсинг скриптов
Такая вот проблема. Думаю над системой парсинга скриптов (пока не начал реализовывать) и столкнулся с такой проблемой. Допустим, у меня есть скрипт файл, который надо отпарсить:
---------------Script.uss content---------------------- MoveEntity door, 0,.1,0 y=y+1 --------------end script-------------------------------- , где door - какойто объект, существующий в мире (заданный изнутри блица), а y - какая то переменная, заданная изнутри блица. Как отпарсить эти строчки? Причем проблема то даже не в общем парсинге, а в парсинге entity из скрипта. Ведь entity в блице это указатель на объект, и вот как присвоить какое нибудь значение внутренней блицевской переменной из скрипта? Или сделать что нибудь с entity из скрипта? А то пока никаких идей... |
Ответ: Парсинг скриптов
LD
регистрировать в скриптовой машине имя переменой и указатель на нее так ты можешь из скрипта менять блицевские переменые ps. это вроде идинственый простой метод |
Ответ: Парсинг скриптов
Мне интересны не сколько простые методы, сколько общий алгоритм действий, ведь полезнее будет знать несколько методом решения данной задачи. Но все равно спасибо )
|
Ответ: Парсинг скриптов
LD
к примеру еще можно регистрировать переменую после выделения ей памяти (написать свой менеджер памяти, но тогда не очень понятно с именами переменных) |
Ответ: Парсинг скриптов
просто возьми готовый скриптовой язык для Б3Д,например есть BSE.
|
Ответ: Парсинг скриптов
Genius
|
Ответ: Парсинг скриптов
Про существование BSE я знаю, но зачем использовать готовое, когда интереснее написать свое. Так легче понять принцип работы скриптовой машины, и соответственно зная архитектуру легче ей оперировать.
|
Re: Парсинг скриптов
ужас вы где таких слов понабрались, нельзя попростому)
while mid(s,i,1)<>"." i++ wend вот так это делается. |
Ответ: Парсинг скриптов
Leito
у тебя в строке содержится "door_1" как ты найдешь по тексту в строке переменную в блице ? при етом строка может менятся ... если ты мне раскажешь как найти того чего нет (имя переменых убиваются при компиляции) то буду очень благодарен :) |
Ответ: Парсинг скриптов
А зачем обращаться именно по имени? Допустим перед началом работы передает в скрипт запрошенные им переменные (допустим пусть это будет адрес области памяти, в которой храниться значение этой переменной (относится и к ентитям также)). Но следовательно возникает две проблемы:
1) Как узнать в какой области памяти храниться переменная (желательно еще знать ее тип, чтобы правильно определить смещение по блоку) 2) Как оперировать переменной зная ее адрес в памяти (как издевательство можно ассемблерной врезкой работать с регистрами проца (то есть хранить переменную не только в памяти но и в регистрах (допустим y в ах? и.т.д) и соответственно передавать в скрипт нужный регистр... Но в этом методе есть свои минусы.... Может есть какие нибудь еще варианты? Все таки интересно с памятью - надеюсь сможете помочь ) |
Ответ: Парсинг скриптов
LD
Почитай про http://ru.wikipedia.org/wiki/JIT но в любом случае тебе нужно будет делать обвязку чтобы из программы обращатся к переменным скрипта или наоборот |
Ответ: Парсинг скриптов
Может я конечно туплю, не бить сильно...
Но разве нельзя использовать сначала NameEntity, цикл по всем entity и сверять EntityName? В dll'ках (например в darkextension), кстати, были функции FirstEntity, LastEntity, NextEntity и т.д. |
Ответ: Парсинг скриптов
Michael
Код:
; .. тут мы еще можем обратится к переменной SomeVar идинственый вариант это сохранить где нибудь имя и адресс переменной в первой части а во второй уже по имени получать адресс и обращатся к переменной |
Ответ: Парсинг скриптов
ну так а что мешает проверить If EntityName$(entity)="NeedEntity" then ...
Ну и естественно, это только для объектов. |
Ответ: Парсинг скриптов
ну дык ето не будет работать.
у тебя то EntityName(ent) = SomeVar. jimon, а как узнать адрес блицовой переменной? разве льзя? |
Ответ: Парсинг скриптов
Этого я не знаю, знаю как в blitzmax получить указатель на переменную
|
Re: Парсинг скриптов
есть 2 варианта по моему мнению( всё завист от того как именно ты хочеш грузить скрип)
1 первый, если скрипт утебя должен идти вместе с игрой. Тогда проще передать ссылку и файл со скритом в функцию обработки скрипта, которая каждый цикл будет выполнять каждый пункт скрипта. 2 вариант, если на время выполнения скрипта всё останавливается. тогда всё проще с одной стороны, но... Скорее всего прийдётся знать зарание что именно юудет сриптоватся и написать функцию типа этой Код:
Function Script_Run(script$) Код:
PLR |
Ответ: Парсинг скриптов
DimasSup
не известно компилирует ли blitzmax\blitz3d select как переход по таблице или компилирует с кучей if'ов я делал в blitzmax так что каждая команда ето отдельный тип у которого есть тип "do" потом при загрузки скрипта все команды создают ети типы и заводятся в общий список после етого идет простой проход по циклу с управляющей переменой (та которая содержит номер исполняемой команды, нужна для реализации всяких функций, переходов и тд) в идеале можно сделать нечто типа мета-программирования у нас есть Engine.dll,Game.exe и Game.dll который реализует всю логику игры пишем компилятор который переводит наш простой сриптовый язык в тот язык который может скомпилироватся в dll'ку и потом компилируем эту dll и подрубаем к игре в принципе схожая вещь сделана в quake3,quake4,doom3 но там C/C++ код специально компилировался и запускался на виртуальной машине такой подход тоже можно реализовать, он называется реал-тайм компиляцией в нативный код тоесть при загрузки скрипта, встроенный компилятор просто компилирует его в нативный код и запускает из программы ) |
Часовой пояс GMT +4, время: 11:57. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot