Lexer für PB 4

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Hab noch ein paar Fälle vergessen und einen Teil neu geschrieben. Ich
hoffe, dass ich nicht noch mehr Fehler eingebaut habe :D
Ausserdem habe ich eine Mikrobeschreibung in der Enumeration hinzuge-
fügt.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Wieder ein paar Probleme gelöst (die meisten Probleme kommen vom
Erkennen von Pointern oder Multiplikation, sowie Konstanten und Makro-
verkettung).
Damits nicht nur ein einfaches Doppelposting ist, hab ich noch kurz ein Beispiel
geschrieben, welches die Aufrufe von Interfacemethoden aus einer PB-
Datei liest:

Code: Alles auswählen

Structure TOKEN 
  LineNb.l 
  s.s 
  Type.l 
EndStructure 

NewList tokens.TOKEN() 

Define.iPBSC test 
test = New_PBSC() 


If test\SetFile("test.pb") 
  
  ; Read everything into a Linked List 
  While test\IsNextToken() 
    AddElement(tokens()) 
    tokens()\s      = test\GetNextToken() 
    tokens()\LineNb = test\GetCurrentLineNb() 
    tokens()\Type   = test\GetCurrentType() 
  Wend 
  
  ; Search for interface methods 
  ForEach tokens() 
    If tokens()\Type = #PBSC_Identifier 
      If NextElement(tokens()) And tokens()\s = "(" 
        If PreviousElement(tokens()) And PreviousElement(tokens()) And tokens()\s = "\" And NextElement(tokens()) 
          Debug "In line "+Str(tokens()\LineNb)+" somebody calls the method "+tokens()\s 
        Else 
          NextElement(tokens()) 
        EndIf 
      Else 
        PreviousElement(tokens()) 
      EndIf 
    EndIf 
  Next 
  
  test\CloseFile() 
EndIf
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

 IncludeFile "Lexer.pbi"
 DisableExplicit

 Lexer.iPBSC = New_PBSC()
 
 String.s = "2 ex"+#lf$
 
 Lexer\SetFileString(String)
 
 While Lexer\IsNextToken()
  
  Token.s = Lexer\GetNextToken()
  Typ     = Lexer\GetCurrentType()
  
  Select Typ
    Case #PBSC_Other        : Debug "Other        : " + Token
    Case #PBSC_Identifier   : Debug "Identifier   : " + Token 
    Case #PBSC_Number       : Debug "Number       : " + Token
    Case #PBSC_String       : Debug "String       : " + Token
    Case #PBSC_Comment      : Debug "Comment      : " + Token
    Case #PBSC_NewLine      : Debug "NewLine      : " + Token
  EndSelect
  
 Wend 
Ein kleiner Bug mit Zahlen und dem 'e'.
Benutzeravatar
fsw
Beiträge: 74
Registriert: 12.09.2004 03:31
Wohnort: North by Northwest

Beitrag von fsw »

edel hat geschrieben:

Code: Alles auswählen

 Lexer\SetFileString(String)
Hast du eine andere version? Diese method ist nicht in dem publiziertem code.

Anyway,
da scheint eine anderer bug zu sein bei kommentaren.
Wenn dieser text geparsed wird:

Code: Alles auswählen

;this is a comment
Class YourObject ;this is a comment
YourValueOfThat.l ;this is a comment
  YourAnotherValue.s
  YourThis(par.l) ;this is a comment
  YourThat()
EndClass ;this is a comment
nachdem der kommentar von der zweiten linie ausgegeben wird kommt kein #LF, aber bei all den anderen linien mit kommentaren kommt danach ein #LF.
Hoffe es ist bei dir reproduzierbar.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

@edel: Ist das überhaupt irgendwo legal? Aber egal, habs behoben.
@fsw: Jap, eine neuere Version (war etwas faul sie schon überall zu posten,
da sie ja noch Fehler beinhalten könnte, jetzt ist sie im ersten Post).

Deinen Fehler kann ich mit der neusten Version nicht reproduzieren...
Wenn der Fehler weiterhin besteht, wäre es ev. möglich, dass er mit der
Kodierung der Datei zusammenhängt.
Benutzeravatar
fsw
Beiträge: 74
Registriert: 12.09.2004 03:31
Wohnort: North by Northwest

Beitrag von fsw »

remi_meier hat geschrieben: @fsw: Jap, eine neuere Version (war etwas faul sie schon überall zu posten,
da sie ja noch Fehler beinhalten könnte, jetzt ist sie im ersten Post).
Der Fehler kommt auch mit dieser version.
remi_meier hat geschrieben: Deinen Fehler kann ich mit der neusten Version nicht reproduzieren...
Wenn der Fehler weiterhin besteht, wäre es ev. möglich, dass er mit der
Kodierung der Datei zusammenhängt.
Kodierung?
Hab mir die zu bearbeitende Datei angeschaut und da ist ueberall OD OA fuer eine neue Zeile.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Hm... also ich hab jetzt den Code direkt aus Opera in eine Datei "Test.txt"
mit dem Windows-Editor kopiert. Mit nachfolgendem Testprogramm habe
ich alle Tokens wie erwartet bekommen (wenn ich nichts übersehen hab).

Code: Alles auswählen

Define s.s, Token.s

Define.iPBSC test
test = New_PBSC()


If test\SetFile("test.txt") 
  
  While test\IsNextToken() 
    
    Token.s  =  test\GetNextToken() 
    
    Select test\GetCurrentType() 
      Case #PBSC_Identifier : Debug "Identifier: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
      Case #PBSC_Number     : Debug "Number: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
      Case #PBSC_String     : Debug "String: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
      Case #PBSC_Comment    : Debug "Comment: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
      Case #PBSC_NewLine    : Debug "NewLine: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
      Case #PBSC_Other      : Debug "Other: " + Token; +" Line: " + Str(test\GetCurrentLineNb())
        
    EndSelect 
    
  Wend 
  
  test\CloseFile() 
EndIf
Zu NewLine sollte ich noch sagen, dass bei diesem Token die Zeilennummer
nicht immer genau bestimmt ist, also manchmal zählt es zur nächsten
Zeile, manchmal zur aktuellen. Ich hoffe das macht keine Probleme, sonst
werde ich es mir nochmals anschauen.

greetz
Remi
Benutzeravatar
fsw
Beiträge: 74
Registriert: 12.09.2004 03:31
Wohnort: North by Northwest

Beitrag von fsw »

Falscher alarm, jetzt scheint es zu funktionieren. Dankeschoen.

Bezueglich NewLine: waere schoen wenn es irgendwann 100% funktionieren wuerde.

Thanks
:allright:
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

:)
Das beruhigt. Ich hoffe nur, dass ich langsam die gesamte Syntax von
PB abgedeckt habe. Wegen dem NewLine schau ich nochmals, hoffe es
ist nicht allzu kompliziert. Ich werde es wohl, wenn möglich, zur aktuellen
Zeile zählen.

Edit: Ersetze einfach die folgende Methode :D

Code: Alles auswählen

Procedure.l PBSC_GetCurrentLineNb(*this.cPBSC)
  If *this\Started = #False And *this\LastToken = #LF$
    ProcedureReturn *this\FileLine - 2
  Else
    ProcedureReturn *this\FileLine - 1
  EndIf
EndProcedure
Werd sie bei der nächsten Version des Lexers den Code überall updaten,
bin grad etwas zu faul dafür.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Und noch ein Bug :D .

Code: Alles auswählen

Lexer.iPBSC = New_PBSC()
 
String.s = "Class 66 extends bla"        + #lf$
 
Lexer\SetFileString(String)
 
While Lexer\IsNextToken()
  
  Token.s = Lexer\GetNextToken()
  Typ     = Lexer\GetCurrentType()
  
  Select Typ
    Case #PBSC_Other        : Debug "Other        : " + Token
    Case #PBSC_Identifier   : Debug "Identifier   : " + Token
    Case #PBSC_Number       : Debug "Number       : " + Token
    Case #PBSC_String       : Debug "String       : " + Token
    Case #PBSC_Comment      : Debug "Comment      : " + Token
    Case #PBSC_NewLine      : Debug "NewLine      : " + Token
  EndSelect
  
Wend



Identifier : Class
Identifier : 66
Identifier : extends
Identifier : bla
NewLine :
Antworten