Anfänger versucht Parser zu entwickeln

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Anfänger versucht Parser zu entwickeln

Beitrag von Ironsmurf »

Hallo zusammen

ich bin Anfänger und versuche einen Parser zu entwickeln, meine Frage zu folgendem Quelltext ist, ob man die Schreibarbeit noch vereinfachen kann,
es geht darum bestimmte Wörter zu ersetzen.
Z.B. aus Dolch wird Messer oder aus Degen wird Messer.

Vielen Dank im voraus für eure Mithilfe - PS:Habe noch die Demo von PureBasic

;String wird in einzelne Woerter geteilt
num = CountString(text$, " ") + 1
Dim Wort$(num) ; num viele elemente (0 bis num-1)
For I = 0 To num-1
Wort$(I) = StringField(text$, I + 1, " ")
;Wort für Wort analysieren und Synonyme vereinheitlichen
If FindString (Wort$(I),"nehm",1) : Wort$(I)="nimm"
ElseIf Wort$(I)="schwert"Or Wort$(I)="messer"Or Wort$(I)="saebel"Or Wort$(I)="degen"Or Wort$(I)="stichwaffe"Or Wort$(I)="dolch" : Wort$(I)="messer"
ElseIf Wort$(I)="gehen"Or Wort$(I)="gehe"Or Wort$(I)="ging"Or Wort$(I)="laufe"Or Wort$(I)="wandern"Or Wort$(I)="schreite"Or Wort$(I)="schleichen" : Wort$(I)="gehen"
ElseIf FindString (Wort$(I),"nord",1)Or FindString (Wort$(I),"sued",1)Or FindString (Wort$(I),"west",1)Or FindString (Wort$(I),"ost",1) : Wort$(I)="Richtung"
ElseIf FindString (Wort$(I),"movie",1)Or FindString (Wort$(I),"streifen",1) : Wort$(I)="film"
ElseIf FindString (Wort$(I),"gucken",1)Or FindString (Wort$(I),"schauen",1): Wort$(I)="sehen"
EndIf
Ausgabe$ = Ausgabe$ + Wort$(I) + " " : Debug (Ausgabe$)
Next
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Mach mal bidde den Code in CodeTags.
Liege ich mit ReplaceString() richtig?
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Beitrag von Ironsmurf »

Was bitte sind CodeTags (Sorry - leider noch blutiger Laie)
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Code: Alles auswählen

Dein Code
Oder auch den Code-Button benutzen...
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Beitrag von Ironsmurf »

Code: Alles auswählen


;String wird in einzelne Woerter geteilt
num = CountString(text$, " ") + 1 
Dim Wort$(num) ; num viele elemente (0 bis num-1) 
For I = 0 To num-1 
Wort$(I) = StringField(text$, I + 1, " ")
;Wort für Wort analysieren und Synonyme vereinheitlichen
If FindString (Wort$(I),"nehm",1) : Wort$(I)="nimm"
ElseIf Wort$(I)="schwert"Or Wort$(I)="messer"Or Wort$(I)="saebel"Or Wort$(I)="degen"Or Wort$(I)="stichwaffe"Or Wort$(I)="dolch" : Wort$(I)="messer"
ElseIf Wort$(I)="gehen"Or Wort$(I)="gehe"Or Wort$(I)="ging"Or Wort$(I)="laufe"Or Wort$(I)="wandern"Or Wort$(I)="schreite"Or Wort$(I)="schleichen" : Wort$(I)="gehen"
ElseIf FindString (Wort$(I),"nord",1)Or FindString (Wort$(I),"sued",1)Or FindString (Wort$(I),"west",1)Or FindString (Wort$(I),"ost",1) : Wort$(I)="Richtung"
ElseIf FindString (Wort$(I),"movie",1)Or FindString (Wort$(I),"streifen",1) : Wort$(I)="film"
ElseIf FindString (Wort$(I),"gucken",1)Or FindString (Wort$(I),"schauen",1): Wort$(I)="sehen"
EndIf
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Du hättest natürlich auch einfach deinen Post von weiter oben editieren können ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Beitrag von Ironsmurf »

Ich möchte gerne einen Dialog - Bot programmieren zu einem bestimmten Thema (Filme), dazu möchte ich einen Parser entwickeln. Ich poste den ganzen Quelltext, die Wortwahl ist bis jetzt nur zum testen da.

Die Frage lautet, wie ich dieses Programm optimieren kann ?

Vielen Dank im voraus - PS:Hab noch die Demo, Vollversion ist noch nicht eingetroffen.

Code: Alles auswählen


OpenConsole()
;Hallo, sagt das Programm
PrintN( "HALLO" )
PrintN( "BEENDEN KANNST DU DIES PROGRAMM MIT - quit" )
PrintN ( "Wie geht es Dir - USER ?" )
;Globaliere String$
Global Ausgabe$
Procedure String(text$) 
If FindString(Ausgabe$, text$, 1)
ProcedureReturn 1 
Else 
ProcedureReturn 0
EndIf 
EndProcedure 
;Beginn der Endlos - Schleife
Repeat 
PrintN("")
ConsoleColor(13,0)
;Texteingabe
Text$ = Input() : PrintN("")
;Entfernt Space von Beginn & Ende des Strings
Text$ = Trim(text$)
;Konvertiert alle Grossbuchstaben in Kleinbuchstaben
Text$ = LCase(text$)
If Text$ = ("quit") : Break
EndIf
;Satzzeichen , . ; : ! ? werden ermittelt und entfernt
Text$ = RemoveString (Text$,",")
Text$ = RemoveString (Text$,".")
Text$ = RemoveString (Text$,";")
Text$ = RemoveString (Text$,":")
Text$ = RemoveString (Text$,"!")
Text$ = RemoveString (Text$,"?")
;String wird in einzelne Woerter geteilt
num = CountString(text$, " ") + 1 
Dim Wort$(num) ; num viele elemente (0 bis num-1) 
For I = 0 To num-1 
Wort$(I) = StringField(text$, I + 1, " ")
;Wort für Wort analysieren und Synonyme vereinheitlichen
If FindString (Wort$(I),"nehm",1) : Wort$(I)="nimm"
ElseIf Wort$(I)="schwert"Or Wort$(I)="messer"Or Wort$(I)="saebel"Or Wort$(I)="degen"Or Wort$(I)="stichwaffe"Or Wort$(I)="dolch" : Wort$(I)="messer"
ElseIf Wort$(I)="gehen"Or Wort$(I)="gehe"Or Wort$(I)="ging"Or Wort$(I)="laufe"Or Wort$(I)="wandern"Or Wort$(I)="schreite"Or Wort$(I)="schleichen" : Wort$(I)="gehen"
ElseIf FindString (Wort$(I),"nord",1)Or FindString (Wort$(I),"sued",1)Or FindString (Wort$(I),"west",1)Or FindString (Wort$(I),"ost",1) : Wort$(I)="Richtung"
ElseIf FindString (Wort$(I),"movie",1)Or FindString (Wort$(I),"streifen",1) : Wort$(I)="film"
ElseIf FindString (Wort$(I),"gucken",1)Or FindString (Wort$(I),"schauen",1): Wort$(I)="sehen"
EndIf
Ausgabe$ = Ausgabe$ + Wort$(I) + " " : Debug (Ausgabe$)
Next
ConsoleColor(14,0) : PrintN("")
;Ausgabe der Antwort, anhand von Schlüsselwörtern - 3 WÖRTER
If String ("mir")And String ("geht")And String ("gut") : PrintN ( "Das freut mich zu hoeren, das es Dir gut geht USER.")
ElseIf String ("bist")And String ("du") And String ("da") : PrintN ( "Ja, wo soll ich denn sonst sein." )
;Ausgabe der Antwort anahnd von Schlüsselwörtern - 2 WÖRTER
ElseIf String ("film")And String ("sehen") : PrintN ( "Was willst Du denn fuer einen Film sehen ?" )
ElseIf String ("geht")And String ("dir") : PrintN ( "Danke der Nachfrage - USER." )
ElseIf String ("fuehle")And String ("wohl") : PrintN ( "Ich bin erfreut, dass Du dich wohl fuehlst." )
ElseIf String ("geht")And String ("gut") : PrintN ( "Ich bin erfreut das es Dir gut geht." )
ElseIf String ("geht")And String ("so") : PrintN ( "Vieleicht geht es Dir besser, wenn Du Dir einen Spielfilm ansiehst." )
;Ausgabe der Antwort, anhand von Schlüsselwörtern - 1 WORT
ElseIf String ("nachfrage") : PrintN ("Es freut mich, dass es Dir gut geht.")
ElseIf String ("gut") : PrintN ("Schoen zu hoeren, das es Dir gut geht.")
Else : ConsoleColor (15,0) : PrintN ( "Das Thema lautet FILM, deswegen habe ich Deine Eingabe nicht verstanden - USER." )
EndIf
Ausgabe$ = ""
ForEver
CloseConsole()
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Der Code ist auf jedenfall zu unübersichtlich, du solltest einrücken und Leerzeilen lassen damit dir das nicht über den Kopf wächst.

KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Beitrag von Ironsmurf »

Stimmt, es ist noch unübersichtlich, was daran liegt, das die DEMO nur
200 Zeilen zur verfügung stellt.
Leider ist die Vollversion noch nicht eingetroffen.
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Hatte man da nich immer 800 Zeilen :?
(\/) (°,,,°) (\/)
Antworten