powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / А как бы Вы реализовали интерпретатор DSL на Java?
15 сообщений из 40, страница 2 из 2
А как бы Вы реализовали интерпретатор DSL на Java?
    #38328848
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kT_________парни.а подскажите где можно примеры красивые найти ссловарей и описание развернутое.например:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate statemachine "http://www.xtext.org/example/secretcompartments/Statemachine"

Statemachine :
     {Statemachine}
     ('events' 
          events+=Event+ 
     'end')?
     ('resetEvents' 
          resetEvents+=[Event]+ 
     'end')?
     ('commands' 
          commands+=Command+ 
     'end')?
     states+=State*
;

Event:
     name=ID code=ID
;

Command:
     name=ID code=ID
;

State:
     'state' name=ID
          ('actions' '{' actions+=[Command]+ '}')?
          transitions+=Transition*
     'end'
;

Transition:
     event=[Event] '=>' state=[State]
;



http://javatutor.net/books/tip/complex_system_states
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38329585
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто может рассказать или показать интеграцию хтекст и спринга?)
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38329619
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xtext - с синтаксисом всё понятно, проблем нет. Куча всего генерится, валидаторы, УИ, тесты, генераторы. Конечно язык там (например смотрим генератор, который в деволтном проекте) ..тема на любителя. Из плюсов, для дсл-ного языка автоподстановка, подсветка синтаксиса, всплывающие подсказки (если их написать ;)), автообновление кода после изменений в дсл, всякие генераторы схем и прочее что можно реализовать на платформе Эклипса)).
Язык там xtend если я правильно понимаю). Действительно на любителя:



Но вот что больше всего интересно как это прикрутить к Спрингу, стаковерфлов говорит так:




Коллеги, кто сталкивался или м б попадались исходники, подскажите пожалуйста.
п.с. Инфы достаточно по библиотеке, как видео так и пдф-док, т.ч. про недокументированность это я погорячился =(. Но про интеграцию нет инфы, правда неоднократно попадалось как к Гугл_Джус прикрутить.
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38329626
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kT_________Xtext - с синтаксисом всё понятно, проблем нет. Куча всего генерится, валидаторы, УИ, тесты, генераторы. Конечно язык там (например смотрим генератор, который в деволтном проекте) ..тема на любителя. Из плюсов, для дсл-ного языка автоподстановка, подсветка синтаксиса, всплывающие подсказки (если их написать ;)), автообновление кода после изменений в дсл, всякие генераторы схем и прочее что можно реализовать на платформе Эклипса)).
Язык там xtend если я правильно понимаю). Действительно на любителя:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
package org.xtext.example.mydsl.generator

import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.IGenerator
import org.eclipse.xtext.generator.IFileSystemAccess
import org.xtext.example.mydsl.statemachine.Statemachine
import org.xtext.example.mydsl.statemachine.Event
import org.xtext.example.mydsl.statemachine.Command
import org.xtext.example.mydsl.statemachine.State

class MyDslGenerator implements IGenerator {
 
 override void doGenerate(Resource resource, IFileSystemAccess fsa) {
  fsa.generateFile(resource.className+".java", toJavaCode(resource.contents.head as Statemachine))
 }
 
 def className(Resource res) {
  var name = res.URI.lastSegment
  name.substring(0, name.indexOf('.'))
 }
 
 def toJavaCode(Statemachine sm) '''
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 
 public class «sm.eResource.className» {
  
  public static void main(String[] args) {
   new «sm.eResource.className»().run();
  }
  
  «FOR c : sm.commands»
   «c.declareCommand»
  «ENDFOR»
  
  protected void run() {
   boolean executeActions = true;
   String currentState = "«sm.states.head.name»";
   String lastEvent = null;
   while (true) {
    «FOR state : sm.states»
     «state.generateCode»
    «ENDFOR»
    «FOR resetEvent : sm.resetEvents»
     if ("«resetEvent.name»".equals(lastEvent)) {
      System.out.println("Resetting state machine.");
      currentState = "«sm.states.head.name»";
      executeActions = true;
     }
    «ENDFOR»
    
   }
  }
  
  private String receiveEvent() {
   System.out.flush();
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   try {
    return br.readLine();
   } catch (IOException ioe) {
    System.out.println("Problem reading input");
    return "";
   }
  }
 }
 '''
 
 def declareCommand(Command command) '''
  protected void do«command.name.toFirstUpper»() {
   System.out.println("Executing command «command.name» («command.code»)");
  }
 '''
 
 def generateCode(State state) '''
  if (currentState.equals("«state.name»")) {
   if (executeActions) {
    «FOR c : state.actions»
     do«c.name.toFirstUpper»();
    «ENDFOR»
    executeActions = false;
   }
   System.out.println("Your are now in state '«state.name»'. Possible events are [«
    state.transitions.map(t | t.event.name).join(', ')»].");
   lastEvent = receiveEvent();
   «FOR t : state.transitions»
    if ("«t.event.name»".equals(lastEvent)) {
     currentState = "«t.state.name»";
     executeActions = true;
    }
   «ENDFOR»
  }
 '''
 
}


Но вот что больше всего интересно как это прикрутить к Спрингу, стаковерфлов говорит так:


Код: java
1.
2.
3.
4.
5.
6.
7.
new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri("../");
Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
Resource resource = resourceSet.getResource(
    URI.createURI("platform:/resource/org.xtext.example.mydsl/src/example.mydsl"), true);
Model model = (Model) resource.getContents().get(0);




oO

Коллеги, кто сталкивался или м б попадались исходники, подскажите пожалуйста.
п.с. Инфы достаточно по библиотеке, как видео так и пдф-док, т.ч. про недокументированность это я погорячился =(. Но про интеграцию нет инфы, правда неоднократно попадалось как к Гугл_Джус прикрутить.
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38329630
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинkT_________парни.а подскажите где можно примеры красивые найти ссловарей и описание развернутое.например:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate statemachine "http://www.xtext.org/example/secretcompartments/Statemachine"

Statemachine :
     {Statemachine}
     ('events' 
          events+=Event+ 
     'end')?
     ('resetEvents' 
          resetEvents+=[Event]+ 
     'end')?
     ('commands' 
          commands+=Command+ 
     'end')?
     states+=State*
;

Event:
     name=ID code=ID
;

Command:
     name=ID code=ID
;

State:
     'state' name=ID
          ('actions' '{' actions+=[Command]+ '}')?
          transitions+=Transition*
     'end'
;

Transition:
     event=[Event] '=>' state=[State]
;



http://javatutor.net/books/tip/complex_system_states

благодарю!
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38330494
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, помоги! Словил клин =(
Не могу найти примеры интеграции Хтекст и Спринга, туториалы пишут что есть четыре варианта вписать ДСЛ в ява код, не могу осилить зоопарк этих Хтекст, Хпенд, Хбайс, Хтенд. Поделитесь опытом, плиз. Спасибо.
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38333216
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, прошу прощения за трололо, но подниму. Т.к. актуально, и надеюсь что как-то решим этот вопрос.Спасибо за понимание)
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38333565
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kT_________Ребята, прошу прощения за трололо, но подниму. Т.к. актуально, и надеюсь что как-то решим этот вопрос.Спасибо за понимание)

на рсдн.ру спроси еще )
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38335723
PSV100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kT_________,

на счёт Xtext ничего не скажу, не использовал. Но Вы толком не обрисовали суть задачи, поэтому никто толком ничего и не советует. Возможно, м.б. проще всё сделать самому, вроде как, ANTLR и JavaCC считаются классикой. Или взять готовое: JRuby, Jython, Scala и т.п., или Groovy, который скриптовый и "поближе" к java, имеет кучу выкрутасов для DSL ( Builders , Command chains или здесь и т.п.). Если нужен разбор дампов данных, или разбор большого потока и т.п., то м.б. составление глобального AST, многократная его обработка, генерация огромного байт-кода (т.е. всё впихивать в исходники и бинарные классы) - не тот сценарий. Возможно лучше использовать потоковый парсер токенов. Вот здесь я выкладывал пример подобного парсера для ручной работы, можно найти аналог на java или лучше реализовать самому. Если при этом нужна поддержка несложных вычислений, то можно подключить те же скриптовые системы а-ля Rhino, Groovy или BeanShell, или простые интерпретаторы (например, здесь раньше рекомендовали org.apache.commons.jexl2), или генерировать jvm-код, например, через ASM ( презентация ).
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38336214
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PSV100kT_________,

на счёт Xtext ничего не скажу, не использовал. Но Вы толком не обрисовали суть задачи, поэтому никто толком ничего и не советует. Возможно, м.б. проще всё сделать самому, вроде как, ANTLR и JavaCC считаются классикой. Или взять готовое: JRuby, Jython, Scala и т.п., или Groovy, который скриптовый и "поближе" к java, имеет кучу выкрутасов для DSL ( Builders , Command chains или здесь и т.п.). Если нужен разбор дампов данных, или разбор большого потока и т.п., то м.б. составление глобального AST, многократная его обработка, генерация огромного байт-кода (т.е. всё впихивать в исходники и бинарные классы) - не тот сценарий. Возможно лучше использовать потоковый парсер токенов. Вот здесь я выкладывал пример подобного парсера для ручной работы, можно найти аналог на java или лучше реализовать самому. Если при этом нужна поддержка несложных вычислений, то можно подключить те же скриптовые системы а-ля Rhino, Groovy или BeanShell, или простые интерпретаторы (например, здесь раньше рекомендовали org.apache.commons.jexl2), или генерировать jvm-код, например, через ASM ( презентация ).




душевно!оч благодарен. вопрос решился на половину, пару ночей и готово.
Хтекс - порадовал, идет в комплекте с Хтенд (заодно можно ознакомиться с Хкоре) с задачей конвертить один тип данных в другой справляется прекрасно, так ещё куча плюх, валидаторов, парсеров и т.п., короче генериться всё, а руками при необходимости допиливается.

Работает фреймворк как мета-метапрограммирование. Генеря Хтенд (диалект Явы), предлагается уже им генерить Ява_код, создать проект заранее или нагенерить его на Хтенд - не важно, бле, какая же это круть!!!
Представьте как можно на лету заворачивать доменные сущности в верблюда и т.п., + есть на гуглкоде проект плюшки Хтекста для Ру)) .


Но работает это на Eclipse Modeling Project (EMP), и в стандэлон как-то запустить нагенерированный код конечно можно, но если таких парсеров несколько сотен, то утомительно писать ...


остался один вопрос.. как пистаь много и быстро простых парсеров?? АНТРЛ???
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38337134
PSV100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kT_________..., но если таких парсеров несколько сотен, то утомительно писать ...

остался один вопрос.. как пистаь много и быстро простых парсеров?? АНТРЛ???

Имхо, нужен фреймворк, который позволяет задавать правила разбора модульно, т.е. часть правил можно обобщить и многократно подключать в других синтаксических модулях. Грамматики а-ля BNF/PEG задаются в виде спец-DSL или через java/scala-код, нужно оценить, как удобнее. Кроме ANTLR, имхо, можно глянуть на Rats!, JParsec, parboiled и др. Или, чем возиться с проблемами и особенностями сторонней системы, м.б. проще реализовать ручной разбор через простой и настраиваемый парсер лексем.
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38337354
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PSV100kT_________..., но если таких парсеров несколько сотен, то утомительно писать ...

остался один вопрос.. как пистаь много и быстро простых парсеров?? АНТРЛ???

Имхо, нужен фреймворк, который позволяет задавать правила разбора модульно, т.е. часть правил можно обобщить и многократно подключать в других синтаксических модулях. Грамматики а-ля BNF/PEG задаются в виде спец-DSL или через java/scala-код, нужно оценить, как удобнее. Кроме ANTLR, имхо, можно глянуть на Rats!, JParsec, parboiled и др. Или, чем возиться с проблемами и особенностями сторонней системы, м.б. проще реализовать ручной разбор через простой и настраиваемый парсер лексем.


А если так:
ДСЛ делается на Хтексте, потом генерится Хтенд_код, в котором руками дописать не только генерацию Ява_кода, а ещё Спирита на С++, жесть? изврат? И подключать парсеры нагенерированные на С++ ..ну там мммм, ка кпростые утилиты))) надо парсить потоки вывода, а Ява_коду отдавать через WSDL, который генерить автоматом.. как со стороны Явы так и со стороны С++, первичные парсеры на плюсах будут бодрее чем на Яве.
Получается отдельно собирать Ява проект и С++, но эт можно заскриптовать, не проблема.
ДО конца не ясно чем данные передавать, WSDL или домеными сокетами.. идеально в БД писать, но МуСКЛ С++ АПИ ..истинное зло)))

А другие языки/диалекты конечно норм, но буливар двоих не вынесет;)
Хочу Спирит. Создам отдельный топик в С++. Не закрывайте пока этот. Спасбо.
п.с. Непозволительная роскошь каждую неделю учить новый синтаксис((
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38337380
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38337382
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kT_________PSV100пропущено...

Имхо, нужен фреймворк, который позволяет задавать правила разбора модульно, т.е. часть правил можно обобщить и многократно подключать в других синтаксических модулях. Грамматики а-ля BNF/PEG задаются в виде спец-DSL или через java/scala-код, нужно оценить, как удобнее. Кроме ANTLR, имхо, можно глянуть на Rats!, JParsec, parboiled и др. Или, чем возиться с проблемами и особенностями сторонней системы, м.б. проще реализовать ручной разбор через простой и настраиваемый парсер лексем.


А если так:
ДСЛ делается на Хтексте, потом генерится Хтенд_код, в котором руками дописать не только генерацию Ява_кода, а ещё Спирита на С++, жесть? изврат? И подключать парсеры нагенерированные на С++ ..ну там мммм, ка кпростые утилиты))) надо парсить потоки вывода, а Ява_коду отдавать через WSDL, который генерить автоматом.. как со стороны Явы так и со стороны С++, первичные парсеры на плюсах будут бодрее чем на Яве.
Получается отдельно собирать Ява проект и С++, но эт можно заскриптовать, не проблема.
ДО конца не ясно чем данные передавать, WSDL или домеными сокетами.. идеально в БД писать, но МуСКЛ С++ АПИ ..истинное зло)))

А другие языки/диалекты конечно норм, но буливар двоих не вынесет;)
Хочу Спирит. Создам отдельный топик в С++. Не закрывайте пока этот. Спасбо.
п.с. Непозволительная роскошь каждую неделю учить новый синтаксис((



не утилиты, обычные библиотеки;)
...
Рейтинг: 0 / 0
А как бы Вы реализовали интерпретатор DSL на Java?
    #38337480
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага! Можно через файлы во временной файловой системе либо через CMS
(stands for C++ Messaging Service) is a JMS-like API for C++ for interfacing with Message Brokers such as Apache ActiveMQ.

Ппц, но только молодость только хардкор!
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / А как бы Вы реализовали интерпретатор DSL на Java?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]