Program budujący drzewko na podstawie danych z pliku tekstowego.

0

Witam, chciałbym się dowiedzieć czy spotkał się ktoś kiedyś z kodem, który pozwala na wybudowanie drzewka z napotkanych danych z pliku tekstowego. Chodzi mi o to by program sam stworzył takie drzewo i wyświetlił je w oknie graficznym.

Np. w pliku tekstowym mamy takie oto dane

(fragment programu)
#1= PROJECT('EXECUTE EXAMPLE1',#2,(#4),$,$,$);
#2= WORKPLAN('MAIN WORKPLAN',(#10,#11,#12,#13,#14),$,#8,$);
#4= WORKPIECE('SIMPLE WORKPIECE',#6,0.010,$,$,$,(#66,#67,#68,#69));
#6= MATERIAL('ST-50','STEEL',(#7));
#7= PROPERTY_PARAMETER('E=200000N/M2');
#8= SETUP('SETUP1',#71,#62,(#9));
#9= WORKPIECE_SETUP(#4,#74,$,$,());
#10= MACHINING_WORKINGSTEP('WS FINISH PLANAR FACE1',#62,#16,#19,$);
#11= MACHINING_WORKINGSTEP('WS DRILL HOLE1',#62,#17,#20,$);
#12= MACHINING_WORKINGSTEP('WS REAM HOLE1',#62,#17,#21,$);
#13= MACHINING_WORKINGSTEP('WS ROUGH POCKET1',#62,#18,#22,$);
#14= MACHINING_WORKINGSTEP('WS FINISH POCKET1',#62,#18,#23,$);
#16= PLANAR_FACE('PLANAR FACE1',#4,(#19),#77,#63,#24,#25,$,());
#17= ROUND_HOLE('HOLE1 D=22MM',#4,(#20,#21),#81,#64,#58,$,#26);
#18= CLOSED_POCKET('POCKET1',#4,(#22,#23),#84,#65,(),$,#27,#35,#37,#28);
#19= PLANE_FINISH_MILLING($,$,'FINISH PLANAR FACE1',10.000,$,#39,#40,#41,$,
#60,#61,#42,2.500,$);
#20= DRILLING($,$,'DRILL HOLE1',10.000,$,#44,#45,#41,$,$,$,$,$,#46);
#21= REAMING($,$,'REAM HOLE1',10.000,$,#47,#48,#41,$,$,$,$,$,#49,.T.,$,$);
#22= BOTTOM_AND_SIDE_ROUGH_MILLING($,$,'ROUGH POCKET1',15.000,$,#39,#50,#41
,$,$,$,#51,2.500,5.000,1.000,0.500);
#23= BOTTOM_AND_SIDE_FINISH_MILLING($,$,'FINISH POCKET1',15.000,$,#39,#52,
#41,$,$,$,#53,2.000,10.000,$,$);
#24= LINEAR_PATH($,#54,#55);
#25= LINEAR_PROFILE($,#57);
#26= THROUGH_BOTTOM_CONDITION();
#27= PLANAR_POCKET_BOTTOM_CONDITION();
#28= GENERAL_CLOSED_PROFILE($,#59);
#29= TAPERED_ENDMILL(#30,4,$,.F.,$,$);
#30= TOOL_DIMENSION(20.000,$,$,$,1.500,$,$);
#31= TWIST_DRILL(#32,2,.RIGHT.,.F.,0.840);
#32= TOOL_DIMENSION(20.000,31.000,0.100,45.000,2.000,5.000,8.000);
#33= TAPERED_REAMER(#34,6,$,.F.,$,$);
#34= TOOL_DIMENSION(22.000,$,$,$,$,$,$);
#35= TOLERANCED_LENGTH_MEASURE(1.000,#36);
#36= PLUS_MINUS_VALUE(0.100,0.100,3);
#37= TOLERANCED_LENGTH_MEASURE(10.000,#38);
#38= PLUS_MINUS_VALUE(0.100,0.100,3);
#39= MILLING_CUTTING_TOOL('MILL 20MM',#29,(#125),80.000,$,$);
#40= MILLING_TECHNOLOGY(0.040,.TCP.,$,12.000,$,.F.,.F.,.F.,$);
#41= MILLING_MACHINE_FUNCTIONS(.T.,$,$,.F.,$,(),.T.,$,$,());
#42= BIDIRECTIONAL(5.000,.T.,#43,.LEFT.,$);
#43= DIRECTION('STRATEGY PLANAR FACE1: 1.DIRECTION',(0.000,1.000,0.000));
#44= MILLING_CUTTING_TOOL('SPIRAL_DRILL_20MM',#31,(#126),90.000,$,$);
#45= MILLING_TECHNOLOGY(0.030,.TCP.,$,16.000,$,.F.,.F.,.F.,$);
#46= DRILLING_TYPE_STRATEGY(75.000,50.000,2.000,50.000,75.000,8.000);
#47= MILLING_CUTTING_TOOL('REAMER_22MM',#33,(#127),100.000,$,$);
#48= MILLING_TECHNOLOGY(0.030,.TCP.,$,18.000,$,.F.,.F.,.F.,$);
#49= DRILLING_TYPE_STRATEGY($,$,$,$,$,$);
#50= MILLING_TECHNOLOGY($,.TCP.,$,20.000,$,.F.,.F.,.F.,$);
#51= CONTOUR_BIDIRECTIONAL($,$,$,$,$,$);
#52= MILLING_TECHNOLOGY($,.TCP.,$,20.000,$,.F.,.F.,.F.,$);
#53= CONTOUR_PARALLEL(5.000,.T.,.CW.,.CONVENTIONAL.);
#54= TOLERANCED_LENGTH_MEASURE(120.000,#56);
#55= DIRECTION('COURSE OF TRAVEL DIRECTION',(0.000,1.000,0.000));
#56= PLUS_MINUS_VALUE(0.300,0.300,3);
#57= NUMERIC_PARAMETER('PROFILE LENGTH',100.000,'MM');
#58= TOLERANCED_LENGTH_MEASURE(22.000,#56);
#59= POLYLINE('CONTOUR OF POCKET1',(#121,#122,#123,#124,#121));
#60= PLUNGE_RAMP($,45.000);
#61= PLUNGE_RAMP($,45.000);
ISO/FDIS 14649-11
© ISO 2002 – All rights reserved 62
#62= ELEMENTARY_SURFACE('SECURITY PLANE',#73);
#63= ELEMENTARY_SURFACE('PLANAR FACE1-DEPTH PLANE',#80);
#64= ELEMENTARY_SURFACE('DEPTH SURFACE FOR ROUND HOLE1',#83);
#65= ELEMENTARY_SURFACE('DEPTH SURFACE FOR POCKET1',#94);
#66= CARTESIAN_POINT('CLAMPING_POSITION1',(0.000,20.000,25.000));
#67= CARTESIAN_POINT('CLAMPING_POSITION2',(100.000,20.000,25.000));
#68= CARTESIAN_POINT('CLAMPING_POSITION3',(0.000,100.000,25.000));
#69= CARTESIAN_POINT('CLAMPING_POSITION4',(100.000,100.000,25.000));
#71= AXIS2_PLACEMENT_3D('SETUP1',#95,#96,#97);
#73= AXIS2_PLACEMENT_3D('PLANE1',#98,#99,#100);
#74= AXIS2_PLACEMENT_3D('WORKPIECE',#101,#102,#103);
#77= AXIS2_PLACEMENT_3D('PLANAR FACE1',#104,#105,#106);
#80= AXIS2_PLACEMENT_3D('PLANAR FACE1',#107,#108,#109);
#81= AXIS2_PLACEMENT_3D('HOLE1',#110,#111,$);
#83= AXIS2_PLACEMENT_3D('HOLE1',#112,#113,#114);
#84= AXIS2_PLACEMENT_3D('POCKET1',#115,#116,#117);
#94= AXIS2_PLACEMENT_3D('POCKET1',#118,#119,#120);
#95= CARTESIAN_POINT('SETUP1: LOCATION ',(150.000,90.000,40.000));
#96= DIRECTION(' AXIS ',(0.000,0.000,1.000));
#97= DIRECTION(' REF_DIRECTION',(1.000,0.000,0.000));
#98= CARTESIAN_POINT('SECPLANE1: LOCATION ',(0.000,0.000,30.000));
#99= DIRECTION(' AXIS ',(0.000,0.000,1.000));
#100= DIRECTION(' REF_DIRECTION',(1.000,0.000,0.000));

I chcemy otrzymać takie drzewko:

+PROJECT
|-EXECUTE EXAMPLE1
+|-WORKPLAN
| |-MAIN WORKPLAN
| +|-(#10,#11,#12,#13,#14)
| | +|-MACHINING_WORKINGSTEP #10
| | | |-WS FINISH PLANAR FACE1
| | | +|-ELEMENTARY_SURFACE #62
| | | | |-SECURITY PLANE
| | | | +|-AXIS2_PLACEMENT_3D #73
| | | | | +|-CARTESIAN_POINT #98
| | | | | | |-SECPLANE1: LOCATION
| | | | | | -(0.000,0.000,30.000)
| | | | | +|-DIRECTION #99
| | | | | | |-AXIS
| | | | | | -(0.000,0.000,1.000)
| | | | | +|-DIRECTION #100
| | | | | | |-REF_DIRECTION
| | | | \ \ -(1.000,0.000,0.000)
| | | |-PLANAR_FACE #16
| | | | |-PLANAR FACE1
| | | | +|-WORKPIECE #4
| | | | | |-SIMPLE WORKPIECE
| | | | | +|-MATERIAL #6
| | | | | | |-ST-50
| | | | | | |-STEEL
| | | | | | +|-PROPERTY_PARAMETER #7
| | | | | | \ -E=200000N/M2
| | | | | |-0.010
| | | | | |-$
| | | | | |-$
| | | | | |-$
| | | | | +|-(#66,#67,#68,#69)
| | | | | | +|-CARTESIAN_POINT #66
| | | | | | | |-CLAMPING_POSITION1
| | | | | | | -(0.000,20.000,25.000)
| | | | | | +|-CARTESIAN_POINT #67
| | | | | | | |-CLAMPING_POSITION2
| | | | | | | -(100.000,20.000,25.000)
| | | | | | +|-CARTESIAN_POINT #68
| | | | | | | |-CLAMPING_POSITION3
| | | | | | | -(0.000,100.000,25.000)
| | | | | | +|-CARTESIAN_POINT #69
| | | | | | | |-CLAMPING_POSITION4
| | | | | \ \ -(100.000,100.000,25.000)
| | | | +|-PLANE_FINISH_MILLING #19
| | | | | |-$
| | | | | |-$
| | | | | |-FINISH PLANAR FACE1
| | | | | |-10.000
| | | | | |-$
| | | | | +|-MILLING_CUTTING_TOOL #39
| | | | | | |-MILL 20MM
| | | | | | +|-TAPERED_ENDMILL #29
| | | | | | | +|-TOOL_DIMENSION #30
| | | | | | | | |-20.000
| | | | | | | | |-$
| | | | | | | | |-$
| | | | | | | | |-$
| | | | | | | | |-1.500
| | | | | | | | |-$
| | | | | | | | -$
| | | | | | | |-4
| | | | | | | |-$
| | | | | | | |-.F.
| | | | | | | |-$
| | | | | | | -$
... i tak dalej

1

Generalnie każdy kompilator tworzy sobie coś w tym rodzaju -> drzewo AST. Jeśli tą zawartość pliku da się opisać jakąś gramatyką bezkontekstową to możesz użyć generatora parserów (ANTlr, bison, yacc) żeby coś takiego zrobić.

0

Skąd mogę pobrać taki generator i jak potem podpiąć to pod projekt w Visual Studio?

0

Skąd mogę pobrać taki generator i jak potem podpiąć to pod projekt w Visual Studio?

Rozumiem ze ban na google i nie potrafisz tam wpisać nazwy żadnego z podanych przeze mnie narzędzi? Wszystkie 3 potrafią generować kod parsera dla C++.

0

Masz problem z konstrukcją drzewa w pamięci czy z jego "narysowaniem"?

0

Interesuje mnie narysowanie drzewa. Pytanie czy da się to zrealizować kroczek po kroczku. Takie przeskakiwanie po tablicy:

(Start analizy po znaku "1=")

  1. Gdy znajdzie "słowo kluczowe" PROJECT - stwórz korzeń o nazwie "a" (tekstem wyświetlanym korzenia jest PROJECT). PROJECT występuje tylko raz więc nie trzeba w tym wypadku zapętlać.
  2. Program musi nadać tymczasową nazwę parametrom oddzielonym przecinkami, znajdującym się między nawiasami jako 1a,2a,3a,... Musi policzyć też ile ich jest. Dla każdego parametru - stwórz gałąź.
  3. Pętla0: Program sprawdza teraz który parametr to odniesienie do konkretnej linijki tekstu. Robi to po kolei przeskakując z 1a na 2a itd. Czyli 2a to np. #2 i jest to odniesienie do linijki "2=". Zapamiętuje ten parametr jako "k" (Jak powtórzy się ta pętla to zacznie sprawdzanie od parametru k+1). Jeżeli nie ma odniesienia w ostatnim parametrze (informacja typu bool), to zamknij Pętla0, Pętla1, Pętla2 i wyświetl wygenerowane drzewko,
  4. Pętla1: Następuje start analizy od pierwszej znalezionej linijki czyli po znaku "2=" ("n="),
  5. Pętla2: Gdy znalazł w tej linijce słowo kluczowe WORKPLAN lub WORKPIECE itd. - dodaj gałąź o nazwie "b" (max do g dochodzi),
  6. Pętla3: Program musi nadać tymczasową nazwę parametrom oddzielonym przecinkami, znajdującym się między nawiasami jako 1b,2b,3b,...). Liczy ile ich jest.
  7. Pętla4: Program sprawdza który parametr to odniesienie do konkretnej linijki tekstu. Robi to po kolei przeskakując z 1b na 2b itd. Zapamiętuje ten parametr jako "l" (Jak powtórzy się to zacznie sprawdzanie od parametru l+1). Jeżeli nie ma odniesienia w ostatnim parametrze gałęzi "b", to zamknij Pętla3, kasuj pamięć o gałęzi "b" i parametrze "l". Zamknij Pętla4. Wróć do Pętla0 i kolejnego parametru gałęzi "a" o ile taki istnieje (czyli w tym wypadku do k+1) i go sprawdź. (Jeżeli taki parametr nie istnieje, to kończ program i wyświetl wygenerowane drzewko.

Obejdzie się bez generatora parserów? Zrobić tablicę z numerów linii tekstu (czyli z 22=, 23=, ....) i parametrów w nawiasach po "słowach kluczowych". Potrzebuję funkcji która generuje kod drzewka.

//
// treeView1
//
this->treeView1->Location = System::Point(49, 12);
this->treeView1->Name = L"treeView1";
treeNode1->Name = L"Node0"; Czyli by dodawała mi gałęzie w zależności od napotkanych danych.
treeNode1->Text = L"PROJECT";
this->treeView1->Nodes->AddRange(gcnew cli::array< System::TreeNode^ >(1) {treeNode1});
this->treeView1->Size = System::Size(256, 471);
this->treeView1->TabIndex = 1;
this->treeView1->AfterSelect += gcnew System::TreeViewEventHandler(this, &MyForm::treeView1_AfterSelect);
//

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