Trace-Aufgabe (Konstruktion eines Funktionsgraphen) - Seite 5

 
jartmailru:
Statische Code-Analyse... Ein Vollzug ist nicht erforderlich.

Ich habe über eine andere Möglichkeit nachgedacht - das Parsen von Text, sozusagen das Parsen von MQL und das Erstellen einer Programmstruktur.
Aber ich weiß nicht einmal, wo ich anfangen soll.

 
tara:

Warum nicht, wenn Sie wollen.

Die Wahl der falschen Umsetzungsmethode zeugt von Unprofessionalität.
 
MetaDriver:

Ist es nicht offensichtlich, dass dieses Problem unlösbar ist? Auf diese Weise könnten wir Paare von arithmetischen () [] und Operator-Klammern {} eliminieren und sie durch eine einzige öffnende Klammer ersetzen. Ist das zu schwach?

;)

Warum?

Schließlich gibt es auch viele unäre Operationen.


jartmailru:
Die Wahl der falschen Umsetzungsmethode zeugt von Unprofessionalität.

Was macht es für einen Unterschied, in welchem Programm Sie programmieren? Was in jedem Unternehmen zählt, ist die Lösungsmatrix.
Alles andere ist irrelevant.
 
jartmailru:
Statische Code-Analyse... Ein Vollzug ist nicht erforderlich.
Der Code wird in Funktionen (Blöcke) unterteilt und dann wird analysiert, wer wen aufruft.

Ich habe die gleiche Idee im Kopf. Nur müsste das gesamte Programm gründlich analysiert werden, um die Berge von den Pickeln zu trennen...

Und es scheint, dass die Hauptperson es nicht braucht, wenn ich richtig liege, muss er die Anrufe auf der Tatsache drucken. Zum Beispiel, wenn die Bedingungen des Anrufs erfüllt sind.

 
sergeev:

Ich habe über eine andere Möglichkeit nachgedacht - das Parsen des Textes, sozusagen das Parsen von MQL und das Erstellen einer Programmstruktur.
Aber ich weiß nicht einmal, wo ich mit der Umsetzung anfangen soll.

Es ist elementar.
Was ist eine Funktion?
.
[ Wort Leerzeichen / es könnte nicht sein ] Wort Funktionsname Klammer "(", etwas dort, Klammer zu ")"
geschweifte Öffner {
.
einige Codes
geschweifte Klammern {, }
.
geschweiftes Schließen }
.
Der erste Teil der Arbeit ist getan.
 
sergeev:

:))

die Aufgabe (wenn Sie den ersten Beitrag gelesen haben) besteht darin, nur eine Service-Funktion zu jeder Funktion des Quellcodes hinzuzufügen - direkt nach "{".

Aber so, dass man alle Quellcode-Passagen erhält und einen Aufrufbaum erstellt.

In diesem Fall werden weder die Eingabeparameter der Quellfunktionen noch ihre Ergebnisse oder der Code darin in irgendeiner Weise verändert



Es geht nicht um reine Spuren. Es geht nur darum, einen Funktionsgraphen zu konstruieren.

Hier ist ein Auszug aus dem Protokoll:

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:

Warum?

Schließlich gibt es nicht wenige unäre Operationen.

Nun, diese Operation ist eindeutig nicht unär. Der "Verschachtelungszustand" in der statischen Textanalyse ist unär. Bei der dynamischen Ablaufverfolgung ist sie binär. Es gibt einen INPUT und einen OUTPUT.

Nicht wahr?

 
MetaDriver:

Ich habe die gleiche Idee im Kopf. Nur müsste das gesamte Programm gründlich analysiert werden, um die Berge von den Pickeln zu trennen...

Und mir scheint, das ist nicht das, was der Starter braucht, wenn ich richtig verstanden habe, muss er die Anrufe auf der Tatsache ausdrucken. Sie wissen schon, wenn die Bedingungen für den Anruf erfüllt sind.

Beim Parsen werden die eigentlichen Aufrufe selbst erkannt. Wer ist mit wem und woher...

Dies ist also die einzige vollständige Lösungsidee, die es bisher gibt.

 
Es gibt kein "gründliches" Parsing sowie "Berge" und "Noppen"...
.
Übrigens... Ich füge hinzu:
.
- Zunächst wird der Programmtext von einem "Lexer" analysiert.
Der Lexer zerlegt den Programmtext in "Token".
In unserem Fall sind das die Token:
.
- Leerraum - Leerzeichen, Tabulatoren, Zeilenenden, usw. -
da wir das Formatierungsprogramm nicht schreiben, ignorieren wir dieses Zeug einfach
- Klammern ( / )
- Klammern [ / ]
- Klammern { / }
- Operatoren + - / *
- Wildcards ;,
alle anderen sind im Wesentlichen Identifikatoren
(Zahlen werden auch in dieser Gruppe sein - aber das ist uns egal).
.
Beim Parsing-Lexing werden Strukturen vom Typ
struct { typeToken, stringToken }
.
Für das Parsing habe ich einen Anhang vom Typ
struct Tocken { typeToken, stringToken, list<Token> list of nested tokens }
Sie können sich aber auch einen einfacheren Weg vorstellen.
.
Und dann die oben erwähnte Gruppierung vornehmen - trivial.
.
Eigentlich ist die Kombination aus Lexer und Parser ein Klassiker des Genres.
Über lex/flex/bison/ant-lr kann ich nicht beraten (ich kenne nicht einmal den Namen ;-D)-.
Ich habe genau handgemacht geschrieben.
 

OK. Ich danke Ihnen allen für die Debatte.