Hi Leute,
für ein Projekt möchte ich boolsche Bedingungen durch den User
parametrieren lassen und diese Bedingungen zur Laufzeit im µC Code (C++)
interpretieren.
Dazu hat der User ein PC Tool, mit dem er die Bedingungen für den
Menschen leserlich aufstellen kann, z.B. so:
Value 1 ist aktiv wenn: (A == B) AND (Y == X) OR ((D == F) AND (U == P))
Diese Bedingungen werden dann exportiert und auf den µC übertragen, das
Exportformat ist dabei flexibel. Die "Arbeit" sollte hier am Host
erledigt werden, dass der µC ein Format bekommt, das effizient
interpretiert werden kann.
Bsp:
1
value_1.active=(A==B)AND(Y==X)OR((D==F)AND(U==P))
2
3
if(value_1.active){
4
do_sth();
5
}
Jetzt könnte ich den String von oben aufwändig auf dem µC parsen, oder
eben bereits aufbereitet an den µC übertragen um das Ganze etwas
performanter zu gestalten.
Ich denke da an folgendes:
1
Festlegung:
2
1:='AND'
3
2:='OR'
4
3:='('
5
4:=')'
6
5:='AND('
7
6:='OR('
Und das dann über scwitch-case parsen:
1
switch(condition){
2
case1:
3
zwischenergebnis=(A==B)&&(Y==X)
4
case2:
5
...
6
}
Ich komme hier nicht wirklich weiter und bitte um Hilfe in Form von
Ideen, Suchbegriffe, Literatur etc.
Die ganzen Interpreter für µPython Lua und wie sie alle heißen sehe ich
hier als overkill, da ich keine vollumfänngliche Scriptsprache benötige,
sondern nur den teil mit boolschen Operationen.
Ich freue mich auf Input ;)
Wenn du es "richtig" machen willst, schau mal nach GNU bison oder yacc.
Dem gibst du eine kontextfreie Grammatik, und er erzeugt dir den C Code
für den Parser.
Effizient übertragen und interpretieren auf dem uC kannst du es z.B. in
Polnischer Notation, codiert mit festgelegten Byte-Worten für die
Operatoren und Variablen.
https://de.wikipedia.org/wiki/Polnische_Notation
Parser schrieb:> für ein Projekt möchte ich...
Na dann mache es doch einfach und denke selber drüber nach.
Ansonsten kommt mir das Anliegen als solches einigermaßen seltsam vor.
Normalerweise hat man es mit Prüfungen zu tun, wo ein ermittelter Wert
in einem bestimmten Bereich liegen muß und der Benutzer kann dessen
Grenzen festlegen, oder sowas Ähnliches.
Aber eine frei programmierbare Logik und deren von dir festgelegte
Syntax sind für Anwender eine stete Quelle für Mißverständnisse und
Denkfehler.
W.S.
Hast du die Bedingung dann als Text?
Im Kernighan und Ritchie war doch mal ein kleiner Interpreter für eine
Art Taschenrechner als Beispiel in C, wenn ich mich recht erinnere.
Wäre das nicht eine Vorlage? Analog deine Syntax in einen Parser
umsetzen...
Wenn die A, B etc. auf dem PC bekannt sind, kannst du es gleich da
auswerten. Sonst den eigenen Parser halt auf dem Controller laufen
lassen. Es ist gar nicht besonders viel Code, aber weil er rekursiv
arbeitet braucht man einige Byte Stack.
Parser schrieb:>... boolsche Bedingungen...> [...]> Value 1 ist aktiv wenn: (A == B) AND (Y == X) OR ((D == F) AND (U == P))
Was sind A, B, Y, X, D, F, U, P?`
Boolsche Variablen?
> Die ganzen Interpreter für µPython Lua und wie sie alle heißen> sehe ich hier als overkill, da ich keine vollumfänngliche> Scriptsprache benötige, sondern nur den teil mit boolschen> Operationen.
Wenn es tatsächlich nur um boolesche Operationen ginge, wäre
die Sache relativ einfach: Disjunktive Normalform, bestimmt
mittels Quine/McClusky und codiert als Ternärvektorliste.
Leider wird sich gleich herausstellen, dass A und B Netzwerk-
sockets sind, X und Y RSA-Keys und so weiter...
Parser schrieb:> Value 1 ist aktiv wenn: (A == B) AND (Y == X) OR ((D == F) AND (U == P))
Sind A, B, Y, X, D, F, U und P boolesche oder numerische Variablen?
Wieviele solcher Variablen gibt es insgesamt?
Gibt es außer AND, OR und == noch weitere Operatoren?
Wo kommen diese Werte her? Sind das Digital- bzw. Analogeingänge des
Mikrocontrollers?
Wenn die Variablen nicht zu viele und alle boolesch sind, ist die für
den Mikrocontroller rechenzeiteffizienteste Methode wahrscheinlich eine
Look-Up-Tabelle, deren Index die Bitkombination aller Variablen ist.
Diese Tabelle kann auf dem PC aus dem booleschen Ausdruck generiert und
auf den Mikrocontroller hochgeladen werden.
Egon D. schrieb:> Leider wird sich gleich herausstellen, dass A und B Netzwerk-> sockets sind, X und Y RSA-Keys und so weiter...
Die nächste Salami-Scheibe pünktlich zum Mittag ...
Parser schrieb:> value_1.active = (A == B) AND (Y == X) OR ((D == F) AND (U == P))
Solche komplexen Ausdrücke zu parsen, ist ein Faß ohne Boden. Das geht
nicht ohne rekursiv arbeitenden professionellen Parser. Auch sind solche
Kettenausdrücke schlecht lesbar.
Zum Selbstbau sollte man nur einen Ausdruck je Zeile zulassen:
t1 = A == B
t2 = Y == X
t3 = t1 AND t2
usw.
Auch wirst Du schnell merken, daß man noch viele weitere Funktionen
benötigt. Z.B. will man Aufgaben nur bei Änderung (Flanke) ausführen
oder nach einer Wartezeit, für eine Zeitdauer, eine Wartezeit abbrechen
usw. usw.
Auf dem PC den Ausdruck mit einem richtigen Parser parsen (z.B.
Boost.Spirit, ANTLR), einen Syntaxbaum aufbauen, und den Ausdruck in
konjunktive oder disjunktive Normalform umformen (Verfahren nach Quine
und McCluskey). Diese lässt sich dann ziemlich einfach ablegen (Liste
von Listen von Variablennamen o.ä.), ohne (rekursive) Baumstruktur. Die
kannst du dann auf den Controller übertragen und simpel auswerten.
Kamal A. schrieb:> GNU bison oder yaccKamal A. schrieb:> Polnischer Notation
Schaue ich mir gleich genauer an, danke.
Klaus W. schrieb:> Hast du die Bedingung dann als Text?
Jo, ich kann es mir als Text aus dem PC tool ausgeben lassen, hier bin
ich frei. Daher schaue ich mal was ich zu deinem Vorschlag finden kann.
Es handelt sich ausschließlich um Enums, deren Einstellwerte am PC
bekannt sind, aber dann individuell am µC gestetzt werden, sodass erst
dort die Auswertung erfolgen kann.
Egon D. schrieb:> Was sind A, B, Y, X, D, F, U, P?`> Boolsche Variablen?
Sorry, ich lese hier viel und kenne den Ärger über Salamitaktik und
schlechte Steuerung der Diskussion durch den TO. Ich versuche wirklich
mein Bestes zu geben um nicht unnötig für Verwirrung zu sorgen. Ist mir
vielleicht bereits misslungen.
Am PC wird folgendes eingestellt:
Wenn Enum XY auf den Wert Z eingestellt ist
AND
Enum ZF auf den Wert P eingestellt ist
OR
...
Dann setze Value_1.active = TRUE
Egon D. schrieb:> Disjunktive Normalform, bestimmt> mittels Quine/McClusky und codiert als Ternärvektorliste.
Disjunktive Normalform ist mir ein Begriff, du meinst dass ich mir damit
die Anzahl an Operatoren einschränken kann? Mit Ternärvektorliste muss
ich mich erst genauer beschäftigen. Hat das was mit dem ternären
operator zu tun?
Yalu X. schrieb:> Wieviele solcher Variablen gibt es insgesamt?
Ich würde es gerne nicht begrenzen, aber aktuell bin ich bei maximal 5,
die in einer solchen Bedingung auftreten.
Yalu X. schrieb:> Gibt es außer AND, OR und == noch weitere Operatoren?
Nein, nur die verundung oder veroderung von Enums, die auf ihre Aktuelle
Einstellung verglichen werden.
Yalu X. schrieb:> Wo kommen diese Werte her? Sind das Digital- bzw. Analogeingänge des> Mikrocontrollers?
Das sind alles nur Systemkonfigurationsparameter, die vom User aktiv im
Display verändert werden.
Andre G. schrieb:> Die nächste Salami-Scheibe pünktlich zum Mittag ...
Wie gesagt... ist nicht meine Absicht. Sorry
Peter D. schrieb:> t1 = A == B> t2 = Y == X> t3 = t1 AND t2
Hier muss ich wie bei allem nochmal drüber nachdenken. Danke für den
Hinweis.
Niklas G. schrieb:> disjunktive Normalform umformen (Verfahren nach Quine> und McCluskey)
Wie bei Egon, damit muss ich mich nun erstmal beschäftigen.
Vielleicht einfacher mittels Karnaugh-Diagramm ?
- Da gibt es schon verschiedene (opensource) tools (screenshot anbei)
- Ist von Processor leichter zu interpretieren als Boolean Algebra
So einen Triavialfurzparser schreibt man doch direkt herunter.
Quine-McClusky, KV Diagramm, meine Fresse - man merkt hier ist man im
E-Techniker-Forum. Jetzt fehlt noch einer der das mit Flip-Flops
zusammenpappt.
Immerhin kennt einer yacc aber selbst das ist hier Kanonen auf Spatzen.
Ausser Pins abfragen kann der E-Technik-Ing nix mit C.
Parser schrieb:> Es handelt sich ausschließlich um Enums, deren Einstellwerte am PC> bekannt sind, aber dann individuell am µC gestetzt werden, sodass erst> dort die Auswertung erfolgen kann.
Wer setzt da wann was? Und wie?
Sind das auf dem µC konstante Konfigurationsparameter, die einmal zu
Programmbeginn gesetzt werden, oder wird das so eine Art SPS-Programm,
das in Echtzeit auf sich ändernde Zustände reagiert?
Oliver
ich würde das auch als simplen Top-Down-Parser einfach rekursiv
hinschreiben.
Soll ja auf einem µC laufen, da ist yacc/bison/antlr/boost_spirit usw.
einfach overkill, wenn man es überhaupt in den Speicher reinkriegt.
Genau wie das Aufbauen und anschließende Auswerten eines Syntax-Baums
oder umwandeln in "Forth"-Zwischencode...
lexx & co kann man sich dabei auch noch einsparen.
@parser
An sich kann man das so machen, aber ...
es ist möglicherweise ratsamer, Methoden anzuwenden, die man beherrscht
oder zu deren Beherrschung einem allenfalls triviale Details fehlen. Du
aber, hast zwar grundsätzlich einen sinnvollen Gedanken, aber Du kannst
ihn nicht umsetzen. Z.B. wendest Du Begriffe bzgl. der Idee nicht sicher
richtig an.
Fallen Dir Alternativen ein, bei denen Du wesentlich weniger fragen
müsstest?
Vielleicht können wir Besseres vorschlagen, falls Du das Problem
beschreibst.
Herr Kaiser von der Mannheimer schrieb:> Immerhin kennt einer yacc aber selbst das ist hier Kanonen auf Spatzen.
Hallo Herr Kaiser!
Wer yacc schreit, und nicht im gleichen Atemzug auch lex erwähnt, weiss
wimre gar nichts. Die beiden im Gespann sind aber immer noch exzellente
Tools um mittel- bis voll-prächtige Parser zu bauen.
Ich zähle mich zwar nicht zu den Spezialisten, obwohl ich schon vor
Urzeiten mit dem Gespann was gebaut hatte: Einen HPUX-Druckertreiber,
der HPGL in Kyocera-PRESCRIBE konvertierte - um die Ausgabe für'n
Stiftplotter auf den damals neu beschafften Kyocera-Laserprinter
umzuleiten.
Es ist nicht mit Kanonen aus Spatzen geschossen, wenn mit Hilfe von
wartbarem (!) lex/yacc-Code der PC eine selbst ausgedachte Syntax in
eine vom uC einfach zu interpretierende Form umwandeln kann. Klar kann
man da auch was 'runterprogrammieren'. Aber wieso sollte man, wenn es
die besagten Tools gibt? Auf'm PC ist Laufzeit kein Problem und Speicher
auch nicht.
Der Interpreter auf'm uC sollte dagegen einfach und schnell sein. Hier
würde ich mal anfangen - und erst in zweiter Instanz mit lex/yacc was
basteln, welches das sekretärinnenlesbare AND/OR-Gedöns in mundgerechte
Häppchen für'n uC aufbereitet.
just my 2ct
Herr Kaiser von der Mannheimer schrieb:> So einen Triavialfurzparser schreibt man doch direkt herunter.
Freut mich, dass das für dich so einfach ist.
KV-Diagramme hatte ich im Studium zu Hauf "gelöst" genauso die
Überführung von Termen in die DNF.
Bezogen auf mein Problemchen bedeutet das, dass ich die Ausdrücke PC
seitig vereinfache und strukturiere, dass diese in einer einheitlichen
Struktur interpretiert werden können? Richtig?
Oliver S. schrieb:> Wer setzt da wann was? Und wie?Parser schrieb:> Das sind alles nur Systemkonfigurationsparameter, die vom User aktiv im> Display verändert werden.Oliver S. schrieb:> das in Echtzeit auf sich ändernde Zustände reagiert?
Echtzeit stört hier bestimmt den ein oder anderen, also würde ich
"angenehm schnell zur Laufzeit" sagen, aber ja:
Genau so.
Schleckermaul schrieb:> Z.B. wendest Du Begriffe bzgl. der Idee nicht sicher> richtig an.
Danke für deine Worte. Wärst du so nett und nennst mir noch die
Begriffe, dass ich diese ab jetzt korrekt anwenden kann?
Stefan ⛄ F. schrieb:> Dafür versuchen Leute deines Schlages
Dafür wurde ja die Arbeitsteilung erfunden ;)
Schleckermaul schrieb:> Vielleicht können wir Besseres vorschlagen, falls Du das Problem> beschreibst.
Ich versuche es nochmal, vielleicht habe ich ja wirklich die falsche
Herangehensweise:
Im Bedienpanel des µC sind verschiedene Menüs und Untermenüs gelistet.
Je nach Einstellung sollen einzelne Menüpunkte angezeigt oder
ausgeblendet werden.
Die Definition der Zusammenhänge ist dem Entwickler (mir) unbekannt,
daher soll der "Kunde" dies in dem besagten PC tool tun. Dieser kennt
die Zusammenhänge.
Wenn der µC nun geflashed beim "Kunde" liegt, möchte dieser diese
Zusammenhänge gerne anpassen wenn er einen Fehler gefunden hat etc.
D.h. er führt seine Anpassungen im PC tool durch und eportiert die
Daten, packt sie auf das Speichermedium des µCs und startete den
Controller neu.
Ich habe mir grundsätzlich zwei Herangehensweisen je nach performance
überlegt. (Das tut aber eigentlich nichts zur Sache.)
1. Liste aus Sicht des Parameters, der einen oder mehrere beeinflusst:
Wird dieser Parameter verändert, werden alle anderen, die durch ihn
beeinflusst werden abgeklappert und deren Bedingung neu berechnet. Das
Ergebnis wird als Flag bei den beeinflussten Parametern abgelegt, dass
diese selbst wissen, dass sie angezeigt werden sollen oder nicht. Dies
wird beim Zeichnen auf dem Display dann abgefragt.
Vorteil: Es wird selten etwas verstellt, daher kann es hier gerne etwas
länger dauern, der Aufbau des Menüs selbst beläuft sich pro Parameter
auf nur eine Abfrage (aktiv == True).
2. Liste aus Sicht des Parameters, der durch einen oder mehrere
beeinflusst wird
Vor dem Zeichnen auf dem Display wird die eigene Bedingung des "Objekts"
geprüft. Wenn in einem Menü mehrere Anzeige-Parameter einer Bedingung
unterliegen, so dauert der Menüaufbau u.U. recht lange bis alles
abgeklappert ist
Parser schrieb:> Freut mich, dass das für dich so einfach ist.
ist es wirklich.
So simple Top-Down ("Taschenrechner")-Parser sind normalerweise
Erstsemester-Stoff.
Hab mal die Mittagspause vertrödelt, und das für deine
Beispiel-Expression runtergetippt.
Ist natürlich so nicht "Fertig", aber tut in dem begrenzten
Anwendungsfall was es soll. Und ist auf jeden Fall flexibler und
leichter zu erweitern, als dein Switch-case Ansatz.
Parser schrieb:> Vor dem Zeichnen auf dem Display wird die eigene Bedingung> des "Objekts" geprüft. Wenn in einem Menü mehrere> Anzeige-Parameter einer Bedingung unterliegen, so dauert> der Menüaufbau u.U. recht lange bis alles abgeklappert ist
Verstehe ich nicht.
Angenommen, es gibt fünf Konfigurationsvariablen.
Angenommen weiter, der Wertebereich jeder Variablen
bestehe aus höchstens acht verschiedenen Werten.
Der Wertebereich von höchstens acht unterschiedlichen
Belegungen lässt sich mit drei Bit codieren. Fünf
solcher Variablen passen also in eine 16bit-Zahl.
Um auf das vorliegen einer ganz spezifischen Kombination
von Einstellungen zu testen, ist ein (EIN!) Vergleich
notwendig. Der Test muss auch nicht jedes mal vor der
Anzeige ausgeführt werden, sondern kann durch das Verlassen
des Konfigurationsmenüs getriggert werden.
Soll ein Parameter bei mehreren Konfigurationen angezeigt
werden, müssen natürlich all diese Konfigurationen in der
Liste stehen.
Dauert die Suche zu lange, muss man die Liste vorsortieren
und binär suchen.
Wird die Liste zu lang, kann man "Don't care"-Belegungen
verwenden, verliert dann aber die Möglichkeit zur binären
Suche.
Parser schrieb:> Herr Kaiser von der Mannheimer schrieb:>> So einen Triavialfurzparser schreibt man doch direkt herunter.>> Freut mich, dass das für dich so einfach ist.
Sorry, aber das ist wirklich trivial. Der Ernst hat gezeigt, wie einfach
das ist.
Anstatt im Forum hier rumzuhängen und sich über Leute zu beschweren,
setzt man sich 2 Stunden hin. Fertig ist die Laube.
Ist weniger Code, als der gesamte Text von dir in diesem Thread.
Nicht prokrastinieren sondern programmieren!
Parser schrieb:> KV-Diagramme hatte ich im Studium zu Hauf "gelöst" genauso die> Überführung von Termen in die DNF.> Bezogen auf mein Problemchen bedeutet das, dass ich die Ausdrücke PC> seitig vereinfache und strukturiere, dass diese in einer einheitlichen> Struktur interpretiert werden können? Richtig?
Ich wuerde die Karnaugh-map (oder lookup-table) auf PC-editor
zusammenstellen und dann zum uC schicken. Dann braucht man gar kein
boolean-algebra-interpreter auf uC
Εrnst B. schrieb:> Hab mal die Mittagspause vertrödelt, und das für deine> Beispiel-Expression runtergetippt.
Hab tausend Dank, ich bin gerade drüber das auf meine Umgebung
anzupassen.
Anhand von solchen Beispielen lerne/verstehe ich am besten.
Auch wenn ich ein bisschen ein schlechtes gewissen habe mir das vorkauen
zu lassen. Danke, echt!
Egon D. schrieb:> Der Test muss auch nicht jedes mal vor der> Anzeige ausgeführt werden, sondern kann durch das Verlassen> des Konfigurationsmenüs getriggert werden.
Das war mein Ansatz unter 1.
Den rest aus deinem Kommentar muss ich mir noch genauer überlegen, den
Kern habe ich denke ich verstanden. Vielen Dank.
PittyJ schrieb:> Der Ernst hat gezeigt, wie einfach> das ist.> Anstatt im Forum hier rumzuhängen und sich über Leute zu beschweren
Ich saß schon zu lange rum, daher mein post. Für gewöhnlich reicht mir
das Lesen in Foren, Fragen stelle ich äüßerst selten. Beschwert habe ich
mich über keinen, zumindest wollte ich das nicht zum Ausdruck bringen.
Prosa kann ich viel schneller schreiben als Code, die Länge ist bei
Prosa und Code ehr nicht zu vergleichen. (Keine Beschwerde ;)
Patrick C. schrieb:> Ich wuerde die Karnaugh-map (oder lookup-table) auf PC-editor> zusammenstellen
Wenn ich mit Ernsts Code nicht weiterkomme verfolge ich das auch weiter,
danke sehr.
Egon D. schrieb:> Angenommen weiter, der Wertebereich jeder Variablen> bestehe aus höchstens acht verschiedenen Werten.
Da es um boolsche Bedingungen geht, würde das eine 8-stufige Logik
erfordern. So was wie "falsch, ganz bestimmt vielleicht falsch,
vielleicht falsch, eher falsch, eher wahr, vielleicht wahr, ganz
bestimmt vielleicht wahr, wahr".
Ich würde da doch eher von zwei Zuständen für jede Variable ausgehen.
Oliver
Jemand schrieb:> TODO: Possible out-of-bounds reads on input>> lol
naja, wollte das nicht unerwähnt lassen, obwohls vmtl. nicht auftreten
kann und am µC sowieso eher harmlos wäre.
Geht z.B. darum:
1
if((*s)[0]=='A'&&(*s)[1]=='N'&&(*s)[2]=='D'){
Wenn *s schon am Stringende steht. Eigentlich sollte dann sowieso kein
Zugriff auf Bytes 1 und 2 nach dem Ende erfolgen, weil (*s)[0]=='A'
schon Falsch ist.
eher zum Lachen ist eine Eigenheit, die sich aus Tippfaulheit, dem
Verzicht auf einen Lexxer, und den Ein-Buchstaben-Variablen ergibt:
"AANDB" ist ein gültiger Ausdruck, wird als "A AND B" interpretiert...
Oliver S. schrieb:> Egon D. schrieb:>> Angenommen weiter, der Wertebereich jeder Variablen>> bestehe aus höchstens acht verschiedenen Werten.>> Da es um boolsche Bedingungen geht, würde das eine> 8-stufige Logik erfordern.
Heute ist erst Mittwoch.
Was an "Der Wertebereich von höchstens acht unterschiedlichen
Belegungen lässt sich mit drei Bit codieren." hast Du nicht
verstanden?
Parser schrieb:> Patrick C. schrieb:>> Ich wuerde die Karnaugh-map (oder lookup-table) auf PC-editor>> zusammenstellen> Wenn ich mit Ernsts Code nicht weiterkomme verfolge ich das auch weiter,> danke sehr.
Nicht vergessen : Falls interpreter auf uC, musz man wenn sich im
zukunft etwas aendert immer beide softwares (uC und PC) anpassen...
@ parser
Situation ist vielleicht etwas kompliziert, dadurch dass der
ursprüngliche Anstatz offenbar doch verfolgt werden soll - was ich im
Moment noch in Frage stellen würde.
Ich werde nur noch einmal dazu raten Paradigmen zu verwenden, die Du
auch beherrschst, oder wenigstens fast. Möglicherweise sagt Dir
"Entscheidungstabelle" etwas. Ein einfaches Schema aus dem sich
Darstellung, Eingabe, Kodierung und Auswertung - wenn man sowas kennt -
relativ einfach und schon in primitiven Begriffen ergeben. Einfach eine
Tabelle, die schon bei der Eingabe eine einfache Struktur erzwingt.
Hingegen ist ein Parser der die gesamte Sprache erkennt und übersetzt
etwas komplizierter; was für den Benutzer evtl. auch einen etwas
schwierigren Lernprozess erfordert, als es bei den eher verbreiteten
Kalkultationstabellen der Fall ist.
Noch eine Bemerkung: Der von Dir gezeigte Ausdruck in dem Variablen A,
B, etc.für Aufzählungen stehen, ist kein boolscher Ausdruck. In solchen
erscheinen nur Wahr und Falsch als Literale.
Schleckemaul schrieb:> Aufzählungen stehen
Danke, dass du noch antwortest, aber das verstehe ich nicht. Was meinst
du mit Aufzählungen? Die Buchstaben sollen Enums darstellen darstellen.
Und nochmal an alle vielen Dank. Es ist wirklich einfach (den
Versicherungsvertreter kann ich nun auch verstehen) und spätestens nach
dem Hinweis von
Klaus W. schrieb:> Taschenrechner als Beispiel in C,
hätte ich das selbst lösen können müssen.
Witzigerweise bin ich nun genau da gelandet wo ich eigentlich nicht hin
wollte: Direkt den String zu interpretieren. Meinen ersten Überlegungen
zufolge hatte ich mir das wesentlich aufwändiger vorgestellt. Ich wäre
wohl mehrfach über den Sting iteriert und hätte Stück für Stück "Terme
extrahiert", Substrings gebildet und diese dann ausgewertet.
Deshalb wollte ich eine fancy Lösung mit minimalem Rechenaufwand a la
Lookup Table, wo der uC keine String Operationen durchführen muss .
Das ist flott genug bei meinen Tests. Morgen werde ich meine komplette
FW anpassen.
Schönen Abend
Parser schrieb:> Schleckemaul schrieb:>> Aufzählungen stehen>> Danke, dass du noch antwortest, aber das verstehe ich nicht. Was meinst> du mit Aufzählungen? Die Buchstaben sollen Enums darstellen darstellen.>
Ähm ... ja. "Enum" ist die Kurzform von "Enumeration" was wiederum ein
englisches Wort ist, dass dem deutschen Wort "Aufzählung" entspricht.
Was bedeutet aber nun "sollen Enums darstellen"? In C-Sprech ist "ein
Enum" entweder eine Deklaration einer Enumeration oder eine Definition
einer Variablen vom Typ einer Enumeration. Aber nur das letztere hat
hier einen Sinn, oder?
Parser schrieb:> Deshalb wollte ich eine fancy Lösung mit minimalem Rechenaufwand a la> Lookup Table, wo der uC keine String Operationen durchführen muss .>> Das ist flott genug bei meinen Tests. Morgen werde ich meine komplette> FW anpassen.
Denke auch, dass du damit keine Geschwindigkeitsprobleme bekommst. Der
Parser läuft da im Endeffekt in O(n) über die Input-Expression, schaut
jeden Buchstaben kaum mehr als einmal an, macht keine dynamischen
Speicher-Allokationen oder String-Kopierereien, braucht nur ein paar
Bytes am Stack pro Rekursionsebene.
Schätze mal dass du da selbst auf einem 20MHz-µC bei unter 0.1ms pro
Auswertung bleibst.
Wobei die meiste Zeit vmtl. für die char ** draufgeht. Wenn man das
ganze nicht reentrant braucht, kann man den positions-Pointer in eine
globale Variable verlegen.
Jobst M. schrieb
>>> (A == B) AND (Y == X) OR ((D == F) AND (U == P))>> (A-B)*(Y-X)+((D-F)*(U-P))
Patrick C. schrieb
>> ??? Und mit '-' meinst du XNOR ?
Jobst M. schrieb
> Versuch's mal mit Subtraktion!
Gerne :
True == True Resultiert True
True XNOR True Resultiert True
True - True Resultiert False
Also...
Patrick C. schrieb:> Also...
Achherrje ...
Ja, die in meinem Kopf befindliche Invertierung (die ich aber bis jetzt
gar nicht gesehen habe) fehlt dort nun und ist in die Berechnung gar
nicht so einfach einzufügen. :-/
Ich ziehe meinen Vorschlag zurück.
Gruß
Jobst