Syntax und Semantik. Einen String "richtig" auseinandernehmen...
-
Hi, ich mal wieder. Es geht noch um dasselbe Projekt, den Matrizenrechner.
Sorry erstmal für den Titel der sagt glaube ich alles und nichts
Es geht darum, dass sich die Überprüfung der eingegebenen Werte auf Syntax und Semantik teilweise recht schwierig (also für mich) gestaltet.
Hier mal ein Bsp:
Menüoption Matrix Multiplikation (Komplex)
erwartete syntax:
a+bj oder
a+jb oder
a oder
bj oder
bj oderwobei a und b gleitkommazahlen oder integers (nat. u.U. auch vorzeichenbehaftet) sind.
meine erste idee war EINE funktion zu schreiben die alles in bezug auf eingabe macht^^ das war dann zuviel des guten weil neben dem o.g. noch einige andere sachen eigegeben werden können wie z.b. einzelne chars, Fkeys oder ganze strings.
die momentane lösung sieht so aus, dass es eine fkt GetUserInput gibt die mit getch u getche aufgebaut ist und die einen string zurückgibt. ihr übergebe ich eine cmd variable die innerhalb von GetUserInput festlegt welche Funktion mit welchen parametern zur Überprüfung aufgerufen werden soll.
das problem ist das es sich wie gesagt für mich recht schwierig gestaltet für ALLE eventualitäten vorzusorgen. es ist z.b. möglich "2..44++j*4..2" eizugeben oder "2.." oder....
es wäre wesentlich einfacher wenn ich genau definieren könnte, erlaubt ist z.b. sequeziell - gleitkommazahl ODER gleitkommazahl UND "+j*" UND gleitkommazahl...
bzw a+bj und die fkt weiss dann dass a und b gleitkommazahlen sind.
mein anliegen wäre eine möglichst elegante methode für dieses problem. ich will nicht ALLES von hand proggn wenn es nicht unbedingt notwendig ist. also position der kommas vorzeichen sowie deren anzahl...vll. etwas ähnliches wie die .replace methode der ich dann sage suche nach einer gleitkommazahl ziehe sie heraus und ersetze den teil durch "" alles was übrig bleibt muss dann ja z.B. "+j*" bei a+j*b sein. oder "+j" bei a+bj.
-
dafür wirst du einen parser brauchen, das ist wirklich nicht so einfach.
am einfachsten wäre:
1. du schreibst dir die grammatik in EBNF syntax auf(such mal bei google danach, wenn du nicht weist was das ist).
2. du holst dir boost::spirit(auch hier wieder googlen)
3. du übersetzt die EBNF syntax direkt in spirit form.
-
hi, die antwort war ja mal superfix.
sieht scharf aus und hört sich hochtrabend an, da wird sich der prof freuen^^
EBNF syntax hab ich noch nie gehört, ich werd mich mal damit beschäftigen.ich halte den thread aktuell....
-
die syntax ist eigentlich nichts weiteres als ein mittel, um die grammatik zu ordnen. sie hilft dir schwarz auf weis darzustellen, wie eine eingabe aussehen kann.
am ende ist das nichts weiteres als sowas in eindeutiger schreibweise:
//pseudocode für einen einfachen parser der addition und multiplikation kennt Zahl=ein oder mehr Zeichen von '0' bis '9' Addition= Zahl '+' Term Multiplikation=Zahl '*' Term Term= Addition oder Multiplikationdas coole an spirit ist, dass es so aufgebaut ist, dass man EBNF fast 1:1 darin übersetzen kann(mit ein paar ekelhaften zusatzfeatures, aber der grundaufbau geht so)
-
hi, ich hab mich mal mit spirit beschäftigt. das problem ist, das ich nicht mal die beispiele machen kann. es heisst im manual "...,the entire framework consists of only header files, with no libraries to link or against to build. Just put the spirit distri in your include path and compile..." gesagt getan. aber er will die #include <spirit-1.8.4/boost/spirit.hpp> datei nicht. bzw ist in der spirit.hpp eine datei die er nicht zu finden behauptet aber sie ist definitiv da.
es existiert auch kein komplettes beispielprogramm wo zu sehen ist welche header dateien ich includen muss.oO
-
Include-Pfade deines Compilers richtig gesetzt?
-
omg. son mist ... "compiler not supported" geht das mit vs6.0 tatsächlich net? es heißt doch "...the entire framework consists of only header files..." oder hat das eine mit dem anderen nix zu tun???
-
Das eine hat mit dem anderen nix zu tun. Der VC6 ist einfach Mist.
-
Wenn ich mich nicht täusche, gibt es für ne frühere Version einen Workaround für VC6... Musst mal in den Archiven der Spirit Homepage suchen...
Ansonsten VS2005 Express C++ gibts umsonst... oder den gcc...
Gruß
-
ich schau mal. vc2005 find ich gelinde gesagt zum K***** die installation/deinstallation dauert ewig. er findet fehler im fertigen programm die in vc6 nichmal als warnung auftauchen und ich bin auch nicht gewillt die ganzen "fehler" die der mir vorwirft aus den über 2500 zeilen code rauszufriemeln. das hab ich schonmal durch und die exe liess sich noch nichteinmal starten.
-
soldalot schrieb:
ich schau mal. vc2005 find ich gelinde gesagt zum K***** die installation/deinstallation dauert ewig. er findet fehler im fertigen programm die in vc6 nichmal als warnung auftauchen und ich bin auch nicht gewillt die ganzen "fehler" die der mir vorwirft aus den über 2500 zeilen code rauszufriemeln. das hab ich schonmal durch und die exe liess sich noch nichteinmal starten.
Das liegt aber nicht an VS2005 sondern an Deinem inkorrekten Code.
-
scheinbar ist hat vc6 wirklich langsam ausgedient....
http://osdir.com/ml/parsers.spirit.general/2003-04/msg00337.html
ich habe jetzt mal geschaut und auch eine spirit version für vc6+sp3 im sourceforge archiv gefunden. ich hoffe mal es geht. ansonsten werde ich wohl in zukunft die vc8.0er ver nutzen. jetzt umzusteigen ist schlichtweg nicht möglich da insgesamt 4 leute an dem projekt arbeiten. ich möchte denen nicht zumuten jetzt noch vc2005 installieren zu müssen...
-
nutz doch den gcc. Code::Blocks als Ide ist in Ordnung. Übrigens, der VC6 mäkelt soviele sachen nicht an, weil er einfach älter ist, als der erste offizielle standard, und der kam 1998 raus! Nebenbei: 2500zeilen code sind zwar nervig aber kein Weltuntergang. normalerweise sind das kleinigkeiten, und die sind schnell geändert.
Viel mehr zeit geht wahrscheinlich dadurch verloren, eine uralt spirit Version zum laufen zu bringen, denn seitdem hat sich einiges getan.
-
ich habs übrigens geschafft. ich habs dann doch nochmal mit vc8.0 versucht und siehe da die examples lassen sich kompilieren. die fehler aus unseren prog habe ich auch beseitigt. über was der so alles rummeckert is scho erstaunlich, z.b.
for(int i=0;i<=temp_str.size();i++)
"<= konflikt zwischen signed und unsigned...." egal, i als unsigned und es geht.
jetzt muss ich den anderen nur noch verklickern das sie den neuen compiler brauchen.... so ich muss jetzt erstmal zur vorlesung. ich mache mich dann heute abend noch dabei und schreibe die grammatik in ebnf...