İzleme görevi (fonksiyon grafiği oluşturma) - sayfa 5

 
jartmailru :
Statik kod analizi... Yürütme gerekmez.

Başka bir seçenek düşündüm - metni ayrıştırmak. tabiri caizse, MQL'yi ayrıştırmak ve bir program yapısı oluşturmak.
ama uygulamaya nasıl başlayacağımı bile bilmiyorum. pratik yoktu.

 
tara :

İstersen neden olmasın.

Yanlış uygulama araçlarını seçmek, profesyonellikten bahseder.
 
MetaDriver :

Bu sorunun çözülemez olduğu gerçekten açık değil mi? Aritmetik () [] ve operatör {} parantez çiftlerini ortadan kaldırmak ve bunları tek bir açma paranteziyle değiştirmek mümkün olacaktır. Güçsüz?

;)

Niye ya.

Sonuçta, epeyce tekli işlemler var.


jartmailru :
Yanlış uygulama araçlarını seçmek, profesyonellikten bahseder.

Evet, neyin programlanacağı arasındaki fark nedir. Her durumda, karar matrisi önemlidir.
Diğer her şey yok
 
jartmailru :
Statik kod analizi... Yürütme gerekmez.
Kod işlevlere (bloklara) ayrılır - daha sonra kimin kimi aradığı analiz edilir.

Ben de bu düşünceye sahibim. Dağları sivilcelerden ayırmak için sadece tüm programın iyice ayrıştırılması gerekecek...

Evet ve konu başlatıcının buna ihtiyacı yok gibi görünüyor, eğer doğru bir şekilde sezdiysem, aramaları olaydan sonra yazdırması gerekiyor. Bir aramanın koşulları gerçekleştiyse iyi yazın.

 
sergeev :

Başka bir seçenek düşündüm - metni ayrıştırmak. tabiri caizse, MQL'yi ayrıştırmak ve bir program yapısı oluşturmak.
ama uygulamaya nasıl başlayacağımı bile bilmiyorum. pratik yoktu.

İlköğretim.
fonksiyon nedir?
.
[ kelime alanı / bu olmayabilir ] kelime işlev adı parantez "(", orada bir şey, parantez kapatma ")"
kıvırcık açılış {
.
bazı kodlar
küme parantezlerini çiftler olarak kabul et {, }
.
kıvırcık kapanış }
.
Çalışmanın ilk kısmı tamamlandı.
 
sergeev :

:))

görev (ilk gönderiyi okursanız), kaynak kodun her işlevine yalnızca bir yardımcı işlev eklemektir - "{" işaretinden hemen sonra.

Ancak kaynak kodun tüm geçişlerini alacak ve bir çağrı ağacı oluşturacak şekilde.

Aynı zamanda, ne orijinal fonksiyonların giriş parametreleri, ne sonuçları, ne de içindeki kod



Temiz bir izden bahsetmiyoruz. Ama sadece bir fonksiyon grafiği oluşturmakla ilgili.

İşte günlüğün bir parçası:

 01 : 45 : 18 CTA0 USDCHF,H1: loaded successfully
01 : 45 : 18 CTA0 USDCHF,H1 inputs: BarsBeforeActivate= 1 ; BarsBeforeConfirm= 0 ; TraceIsAllowed= true ; IsStaticMode= false ; ClearAtFinish= true ; ExcludeFirstBar= false ; ExcludeLastBar= true ; RasingLinesColor=( 0 , 128 , 128 ); ReducingLinesColor=( 255 , 0 , 255 ); 
01 : 45 : 18 CTA0 USDCHF,H1: Init
01 : 45 : 18 CTA0 USDCHF,H1: Init=>NewBar(DeadLine)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>DeleteGroup(Init)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup=>ClearTrend
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup=>ClearTrend=>ClearTrace
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)=>ClearTrend
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)=>ClearTrend=>ClearTrace
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>SaveGroup(Empty)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>PaintGroup(ClearScreen)
 
sergeev :

Niye ya.

Sonuçta, epeyce tekli işlemler var.

Eh, bu operasyon açıkça tekli değil. Statik metin analizinde "iç içe geçme durumu" teklidir. Dinamik izleme ile - ikili. Bir GİRİŞ var ve bir ÇIKIŞ var.

Değil?

 
MetaDriver :

Ben de bu düşünceye sahibim. Dağları sivilcelerden ayırmak için sadece tüm programın iyice ayrıştırılması gerekecek...

Evet ve konu başlatıcının buna ihtiyacı yok gibi görünüyor, eğer doğru bir şekilde sezdiysem, aramaları olaydan sonra yazdırması gerekiyor. Bir aramanın koşulları gerçekleştiyse iyi yazın.

Ayrıştırırken, aramalar aslında kendi başlarına görünecektir. Kim kiminle ve nereden...

bu yüzden şimdilik tek eksiksiz çözüm fikri bu.

 
"Dağlar" ve "sivilceler" gibi "kapsamlı" bir ayrıştırma yoktur...
.
Bu arada... Ekleyeceğim:
.
- Başlangıçta, programın metni "lexer" tarafından analiz edilir.
Lexer, program metnini "belirteçlere" dönüştürüyor.
Bizim durumumuzda, belirteçler:
.
- boşluk - boşluklar, sekmeler, satır sonları vb. -
biçimlendirici yazmadığımız için, bu şeyleri görmezden geliyoruz
- parantezler ( / )
- parantez [ / ]
- parantez { / }
- operatörler + - / *
- hizmet sembolleri ;,
diğer her şey aslında bir tanımlayıcıdır
(sayılar da bu gruba dahil edilecektir - ama umursamıyoruz).
.
Lexing'i ayrıştırırken , aşağıdaki gibi yapılar
struct { typeToken, stringToken }
.
Ayrıştırma için şöyle bir ek kullandım
struct Token { typeToken, stringToken, list<Token> iç içe belirteçlerin listesi }
ama burada daha basit olarak düşünebilirsiniz.
.
Ve sonra yukarıda bahsettiğim gruplandırmayı yapmak önemsizdir .
.
Aslında lexer + parser kombinasyonu türün bir klasiğidir.
lex/flex/bison/ant-lr hakkında danışmayacağım (böyle isimleri bile bilmiyorum ;-D)-
Tamamen el yapımı yazdım.
 

TAMAM. tartışma için hepinize teşekkür ederim.