Forum: Mikrocontroller und Digitale Elektronik Boolscher Interpreter zur Laufzeit


von Parser (Gast)


Lesenswert?

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
  case 1:
3
    zwischenergebnis = (A == B) && (Y == X)
4
  case 2:
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 ;)

von Kamal A. (zenerdiode)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Egon D. (Gast)


Lesenswert?

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...

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Andre G. (andgst01)


Lesenswert?

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 ...

von Peter D. (peda)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Parser (Gast)


Lesenswert?

Kamal A. schrieb:
> GNU bison oder yacc

Kamal 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.

von Patrick C. (pcrom)


Angehängte Dateien:

Lesenswert?

Vielleicht einfacher mittels Karnaugh-Diagramm ?

- Da gibt es schon verschiedene (opensource) tools (screenshot anbei)
- Ist von Processor leichter zu interpretieren als Boolean Algebra

von Herr Kaiser von der Mannheimer (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Der Beitrag vom Versicherungsvertreter war hilfreich wie erwartet.

von Oliver S. (oliverso)


Lesenswert?

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

von Herr Kaiser von der Mannheimer (Gast)


Lesenswert?

Klaus W. schrieb:
> Der Beitrag vom Versicherungsvertreter war hilfreich wie erwartet.

Sagen immer die die auf eine fertige Lösung warten.

von Εrnst B. (ernst)


Lesenswert?

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.

von Schleckermaul (Gast)


Lesenswert?

@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.

von Stefan F. (Gast)


Lesenswert?

Herr Kaiser von der  Mannheimer schrieb:
> meine Fresse - man merkt hier ist man im E-Techniker-Forum

Dafür versuchen Leute deines Schlages, mehr Leistung aus einer Steckdose 
zu holen, indem sich sie das mit anderen Wellenformen schön rechnen.

Beitrag "Maximaler Leistungsbezug Steckdose"

von Alois (Gast)


Lesenswert?

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

von Parser (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

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.

von Egon D. (Gast)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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!

von Patrick C. (pcrom)


Lesenswert?

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

von Jemand (Gast)


Lesenswert?

PittyJ schrieb:
> Sorry, aber das ist wirklich trivial
1
TODO: Possible out-of-bounds reads on input

lol

von Parser (Gast)


Lesenswert?

Ε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.

von Oliver S. (oliverso)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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...

von Egon D. (Gast)


Lesenswert?

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?

von PittyJ (Gast)


Lesenswert?

Εrnst B. schrieb:
> "AANDB" ist ein gültiger Ausdruck, wird als "A AND B" interpretiert...

Ja, sowas war beim Basic in den 80er gang und gäbe.

von Patrick C. (pcrom)


Lesenswert?

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...

von Schleckemaul (Gast)


Lesenswert?

@ 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.

von Parser (Gast)


Lesenswert?

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

von Schleckermaul (Gast)


Lesenswert?

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?

von Jobst M. (jobstens-de)


Lesenswert?

Parser schrieb:
> (A == B) AND (Y == X) OR ((D == F) AND (U == P))

(A-B)*(Y-X)+((D-F)*(U-P))


Gruß
Jobst

von Patrick C. (pcrom)


Lesenswert?

Jobst M. schrieb:
>> (A == B) AND (Y == X) OR ((D == F) AND (U == P))
> (A-B)*(Y-X)+((D-F)*(U-P))

??? Und mit '-' meinst du XNOR ?

von Εrnst B. (ernst)


Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

Patrick C. schrieb:
> ??? Und mit '-' meinst du XNOR ?

Versuch's mal mit Subtraktion!

Gruß
Jobst

von Patrick C. (pcrom)


Lesenswert?

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...

von Jobst M. (jobstens-de)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.