AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie am besten Parsen?

Ein Thema von malo · begonnen am 30. Apr 2005 · letzter Beitrag vom 28. Nov 2005
Antwort Antwort
Seite 4 von 5   « Erste     234 5   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#31

Re: Wie am besten Parsen?

  Alt 1. Mai 2005, 20:46
Moin Malo,

Zitat von malo:
Ich weiß aber grade nicht, ob ich wirklich nur ordinale Typen dafür abfragen muss,
lass es mich mal so sagen:
Es würde mich wundern, wenn nicht
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#32

Re: Wie am besten Parsen?

  Alt 1. Mai 2005, 20:47
Zitat von Mephistopheles:
Zitat von malo:
Dann muss man aber ein hässliches Break ans Ende der Schleife setzen...
Nicht bei einer C-for-Schleife

for(;Abbruchbedingung {} ...
Mag sein, gehört jedoch nicht hierher
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#33

Re: Wie am besten Parsen?

  Alt 1. Mai 2005, 22:43
Hi Malo,

vor kurzem haben wir im Informatikunterricht Parser behandelt, und sogar einen Parser für ein (sehr stark vereinfachtes) Pascal geschrieben.

Besonders wichtig ist, zuerst eine klare Struktur zu haben (kann man schön in Syntaxdiagrammen darstellen).

Wenn du willst, kann ich dir den vereinfachten Parser ja mal schicken, vielleicht hilft dir das was!

Cu, Chris

[EDIT] habs mal angefügt [/EDIT]
Angehängte Dateien
Dateityp: rar parser_minipascal_881.rar (11,1 KB, 49x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#34

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:35
Da es hier in dem Thread ja um u.a. Tokenizer geht, muss ich gleich mal was fragen

Bisher hab ich meinen Tokenizer soweit, dass er mir alles schön zerlegt: Klammern, Zahlen und natürlich auch Rechenzeichen.
Das Problem ist nur: Das Minus ist ja sowohl Rechenzeichen als auch ein Vorzeichen. Wie mach ich meinem Tokenizer klar, ob ein Minus als Vorzeichen oder als Rechenzeichen zu sehen ist?
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#35

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:40
Zitat von Ultimator:
Bisher hab ich meinen Tokenizer soweit, dass er mir alles schön zerlegt: Klammern, Zahlen und natürlich auch Rechenzeichen.
Das Problem ist nur: Das Minus ist ja sowohl Rechenzeichen als auch ein Vorzeichen. Wie mach ich meinem Tokenizer klar, ob ein Minus als Vorzeichen oder als Rechenzeichen zu sehen ist?
Also, mathematisch gesehen gibt es ja eigentlich keinen wirklichen Unterschied zwischen Rechenzeichen und Vorzeichen (bei Addition und Subtraktion). Im Endeffekt wird halt eh alles addiert.
Code:
5-3=2
ist das selbe wie
Code:
5 + (-3) = 2
. Daher würde ich einfach ein Minus immer als Vorzeichen interpretieren. Dann soll der Parser nachher erkennen, dass, wenn zwei Zahlen nacheinander ohne Rechenzeichen (dafür aber einmal mit Vorzeichen) kommen, addiert werden sollen.

Nur meine Idee
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#36

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:41
Gar nicht. Das ist Sache des Parser, der Tokenizer zerlegt nur
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#37

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:46
Zitat von malo:
Also, mathematisch gesehen gibt es ja eigentlich keinen wirklichen Unterschied zwischen Rechenzeichen und Vorzeichen (bei Addition und Subtraktion).
Da liegt das Problem

@Dax: Okay
Der Tokenizer soll das '-' also immer als ein Token ansehen?
Julian J. Pracht
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#38

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:52
Es sei denn, du willst auch strings parsen, dann sollte der Tokenizer das - in einem string nicht erkennen. Aber generell für Matheparser: ja.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#39

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 19:54
Nein, Strings will ich nicht, ich will nur nen Matheparser
Wie isses bei der Multiplikation, Division und (noch schlimmer ) den Potenzen?
Wie lass ich das den Parser richtig auswerten, wo jetzt ein Minuszeichen dazugehört?
Julian J. Pracht
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#40

Re: Wie am besten Parsen?

  Alt 23. Nov 2005, 20:37
Ich misch mich mal ein: Der Tokenizer zerlegt den Inputtext (eine Folge von Zeichen) in eine Folge von 'Token', damit des der Parser einfacher hat. Aus dem Wort 'begin' wird der Token BEGIN, aus dem String 'ein String mit begin' wird der Token STRING (mit einem Verweis auf den String-inhalt), aus einem FooBar wird ein IDENTIFIER (mit dem Verweis auf den Namen 'FooBar') und aus dem Zeichen '-' wird das Token MINUS. Dabei gibt es schon ein paar Fallen. Was soll der Tokenizer z.B. aus ':=' machen? Zwei Token, nämlich COLON und EQUAL, oder ein Token, 'ASSIGNMENT'. Was ist '..', DECIMALPOINT DECIMALPOINT oder DOTDOT (oder was auch immer). Hier kann man z.B. vor den Tokenizer noch einen Präprozessor knallen, der mit einem Lookaheadbuffer das nächste Zeichen prüft und ggf. Metazeichen (z.B. #255, statt :=) an den Tokenizer übermittelt, damit der eben bei jeden 'Zeichen' weiss, woran er gerade ist. Zu kompliziert? Na, ein guter Tokenizer ist ja auch nicht so mal eben geschrieben.

Ein Tokenizer und Parser sollte Jeder ernsthafte Programmierer mal implementiert haben. Meine Meinung.

Eine Möglichkeit, die Punkt-Vor-Strichrechnung zu implementieren, ist die, die Grammatik erstmal zu formulieren und diese dann in Funktionen zu packen, z.B. so:
Code:
Term ::= <Ausdruck> [<StrichOp> <Term>] /* Das in [] angegeben kann, muss aber nicht angegeben werden
StrichOp ::= '+' | '-'
Ausdruck ::= <SimpleTerm> [ <MulOp> <Ausdruck> ]
MulOp ::= '*' | '/'
SimpleTerm ::= '(' <Term> ')' | <Number>
Number ::= [ <Sign> ] <Digits>
<Sign> ::= [<PlusOrMinus> [<Sign>]]
PlusOrMinus ::= '+' | '-'
Das kann man z.B. so programmieren:
Delphi-Quellcode:
Function IsTerm : Boolean;
Begin
  If IsAusdruck Then Begin
    If IsStrichOp then
      If IsTerm Then
        Result := True
      else
        Error 'Term erwartet'
  end
  else
    Error 'Ausdruck erwartet'
End;

Function IsAusdruck : Boolean;
Begin
  If IsSimpleTerm Then Begin
    If IsMulOp then
      If IsAusdruck Then
        Result := True
      else
        Error 'Ausdruck erwartet'
  end
  else
    Error 'SimpleTerm erwartet'
End;

Function IsStrichOp : Boolean;
Begin
  If (CurrentToken = PLUS) Or (CurrentToken = MINUS) Then Begin
    AdvanceToNextToken;
    Result := True;
  End
  Else
    Result := False;
End;
...
Man sollte sich aber mit formalen Grammatiken (z.B. in Backus-Naur Form) auskennen. Das wichtige an der Grammatik ist, das man zu jeden Zeitpunkt anhand des nächsten Token entscheiden kann, wohin die Reise geht. Bei einem mathematischen Ausdruck geht das noch, aber bei einer Programmiersprache wird das schon schwieriger...

Viel Spass!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz