![]() |
Lexikalischer Scanner
Hallo zusammen,
ich will nen Parser selbst programmieren, jedoch habe ich bisher kein Codebeispiel für einen Lexer gefunden. Ich kann mir zwar vorstellen wie er in etwa funktioniert, jedoch wäre ein Codebeispiel überaus praktisch um einen Anfang zu haben. Vll. hat da ja wer was? :wink: MfG Alaitoc |
Re: Lexikalischer Scanner
Hallo,
ich habe mich mal daran versucht: ![]() Vielleicht hilft es dir ja. Ansonsten ist hier einiges, auch leichtverständliches, dazu zu finden: ![]() Daran habe ich mich einigermaßen angelehnt, was den Lexer betrifft. Mit den weiteren Schritten, wie Parser usw. habe ich mich nicht mehr näher beschäftigt, weil ich nicht mehr so viel Freizeit hatte. |
Re: Lexikalischer Scanner
![]() oder JLex das gleiche in Java (vermutlich leichter zu verstehen) |
Re: Lexikalischer Scanner
Schonmal Danke für die schnelle Antwort,
werde mal schauen ob ichs damit hinkrieg. :) MfG Alaitoc |
Re: Lexikalischer Scanner
So hab den Scanner grundlegend hinbekommen, jedoch wie genau soll ich das scannen?
2x+3+3-4+2ab bedeutet ja eigentlich: 2*x+3+3-4+2*a*b Wie sage ich dem Scanner am Besten wie ich die * hinzufügen soll? |
Re: Lexikalischer Scanner
Ich denke nicht, dass das den Scanner etwas angeht ;) . Den würde ich
Code:
zurückliefern lassen, um die versteckte Multiplikation soll sich der Parser kümmern. (Hab mal angenommen, dass Variablennamen nur aus einem Zeichen bestehen dürfen).
... PLUS NUM(2) VAR("a") VAR("b")
|
Re: Lexikalischer Scanner
Zitat:
|
Re: Lexikalischer Scanner
Hier gibt es eine Delphiübersetzung von Lex/Yack
![]() Bei Ausdrücken wie 2ab hast du das Problem, dass er nicht eindeutig ist, es sein denn du lässt nur einstellige Variblennamen zu. In dem Beispiel könntest du die Variablen a, b, ab haben und falls Variablen auch mit Zahlen beginnen dürften auch noch 2ab. Wenn du das an Parser deligieren willst, musst du aber wissen, dass es sich um mehrere Tokens handelt und das geht in dem fall nur mit einstelligen Tokens und somit auch nur mit einstelligen Bezeichnern. Damit ist auch eine Verwendung von "++" beispielsweise ausgeschlossen. |
Re: Lexikalischer Scanner
Zitat:
|
Re: Lexikalischer Scanner
Zitat:
|
Re: Lexikalischer Scanner
So melde mich nu auch wieder :)
Bisher sieht mein sozusagen "Überprüfungscode" so aus:
Delphi-Quellcode:
Bisher klappt es und er fügt die Zeichen immer ein:
procedure TLexer.CheckText;
var i:Integer; begin i:=0; while i <> length(m_Text)+1 do begin case m_Text[i] of 'A'..'Z','a'..'z': begin case m_Text[i-1] of 'A'..'Z','a'..'z': begin Insert('*',m_Text,i); Insert('1',m_Text,i); Insert('*',m_Text,i); end; '0'..'9': begin Insert('*',m_Text,i); end; '+','-','/': begin Insert('*',m_Text,i); Insert('1',m_Text,i); end; #0: begin Insert('*',m_Text,i); Insert('1',m_Text,i); end; end; end; end; case m_Text[i] of '(': begin case m_Text[i-1] of 'A'..'Z','a'..'z': begin Insert('*',m_Text,i); end; '0'..'9': begin Insert('*',m_Text,i); end; end; end; end; case m_Text[i] of '0'..'9': begin case m_Text[i-1] of 'A'..'Z','a'..'z': begin Insert('*',m_Text,i); end; end; end; end; inc(i); end; end; z.b. 2x^2+3ab*5 = 2*x^2+2+3*a*1*b*5 weil mit so ner Struktur ist die Erkennung der Variablen leichter, eine Variable besteht immer aus: Ziffer * Variable unter Umständen dann noch Ziffer * Variable ^ Ziffer Zur Zeit bin ich am Zusammenfassen der Variablen, Addition und Subtraktion funktionieren schonmal soweit. MfG Alaitoc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz