Parser z YAML do C/C++/C# i Pythona i Ruby

0

Muszę napisać program w dowolnym języku (ale najlepiej C#), który wczytuje dane z pliku YAML (schematy blokowe) i po wciśnięciu przycisku konwertuje je na kod programu w C lub C++ lub C#, Rubym i Pythonie.

Plik yaml składa się z dwóch części: obiekty i tekst, gdzie pierwszy obiekt odpowiada pierwszemu tekstowi, itd. np.:

---
objects:
 -
  Name: TERMINAL
  Position X: 861.0
  Position Y: -5.0
  Width: 150.0
  Height: 150.0

 -
  Name: ARROW
  Position X: 921.5
  Position Y: 72.0
  TYPE: 2
  Width: 60.0
  Height: 60.0
  
  
  texts:
 -
  Text: "start"
  Position X: 936.0
  Position Y: 36.0
  Color: 0x800080ff
  Size: 26.0

 -
  Text: ""
  Position X: 935.0
  Position Y: 102.0
  Color: 0x800080ff
  Size: 26.0
  
...

Nie interesują mnie pozycje x,y, wymiary bloków czy kolor, tylko nazwa i tekst, tak, aby można było na ich podstawie zapisać np. instrukcję IF w C. Niestety nie wiem, jak się za tego YAMLa zabrać. Fajnie, gdyby ktoś podpowiedział, jak zacząć, ewentualnie zechciałby pomóc w napisaniu aplikacji (nawet odpłatnie).

2

W sumie fajny projekt.

Najpierw poszukaj parsera YAML dla języka, w którym chcesz napisać konwerter: http://yaml.org/
Napisz kod który parsuje YAML - tłumaczy obiekty na kod zaczynając od start musisz znaleźć strzałkę wychodzącą od niego i parsować wszystkie bloczki aż do end.
Ważne są położenia bloczków i ich wymiary. Dzięki temu wiesz skąd dokąd idzie biegnie strzałka.

0

Czyli jednak położenia bloczków są ważne :)
Mi właśnie o ten kod (który od startu do enda parsuje) chodzi. Nie wiem, jak zamienić obiekt na kod, a tym bardziej sprawdzić połączenie strzałek...

1
DamianOS.MP5 napisał(a):

Nie wiem, jak zamienić obiekt na kod,

Sprawdzasz typ obiektu, strzałki które od niego wychodzą i na tej podstawie zwracasz kod np. w C.

DamianOS.MP5 napisał(a):

a tym bardziej sprawdzić połączenie strzałek...

Strzałka jest trochę brzydko zapisana - bo nie masz jasno zapisanej pozycji początkowej i końcowej.
Przypuszczając, że pozycja strzałki to jej pozycja początkowa, możemy założyć, że szerokość i wysokość to relatywna pozycja punktu końcowego, czyli:

  • początek strzałki to punkt (Position X, Position Y)
  • koniec strzałki to punkt (Position X + Width, Position Y + Height)

Żeby sprawdzić, gdzie jest początek i koniec strzałki po prostu sprawdzasz czy jej początek/koniec znajduje się w prostokącie obiektów. Czyli np.

if ((strzalka.poczatek.x > obiekt.pozycja.x - obiekt.szerokosc/2) && (strzalka.poczatek.x < obiekt.pozycja.x + obiekt.szerokosc/2)
&& (strzalka.poczatek.y > obiekt.pozycja.y - obiekt.wysokosc/2) && (strzalka.poczatek.y < obiekt.pozycja.y + obiekt.wysokosc/2)) {
    // zrob cos z poczatkiem strzalki, np. zapamiętaj przy jakim obiekcie strzałka się zaczynała,
    // bo przetwarzanie następnego obiektu może od tego zależeć
}

Tak samo z końcem.

0

Poczytaj o narzędziu ANTLR

1 użytkowników online, w tym zalogowanych: 0, gości: 1