Parsing af kildekode-filer

Tags:    c++

Hej folkens,

jeg sidder og arbejder på en modulær parser til at parse kildekode-filer. Det jeg forsøger at opnå, er at jeg kan parse teksten vha. regulære expressions, og derefter tildele visse dele af teksten "attributer" automatisk, dette kunne f.eks. være at tildele en kommentar attributten "comment.singleline", hvis parseren mødte en single-line kommentar.

Men jeg er i tvivl om to ting ved det jeg prøver at opnå:
1) Hvordan kunne et system til tildeling af attributter til tekst opbygges?
2) Og hvordan kunne man parse og oprette attributterne rigmelig hurtigt - Jeg går efter at kunne parse rigmeligt store kildekode-filer på rigmelig kort tid.

Hvis i har nogen ideer, til hvordan de to kunne gøres, så vil jeg meget gerne høre dem. På forhand tak :).



Har du overvejet at bruge flex/lex/yacc/bison eller lign?

Jeg bruger et program til at lave .cpp filer om til html, når det skal lægges ud på min hjemmeside.
Det lyder som om det er noget i den stil du vil lave?

Programmet bruger flex til at lave en parser.
Du kan finde det her:
http://damb.dk/java2html.php



Nej, jeg arbejder hen af vejen mod noget i stil med programmet TextMate's parsing system. Grunden til at jeg går efter egen parsing er at jeg vil lave det hele udskifteligt, så jeg kan loade forskellige patterns ind i min parser engine, uden at skulle ændre på enginen. Jeg ved ikke om (F)lex kan klare dette, da jeg aldrig rigtig har fået mulighed for at arbejde med det.

Mens jeg parser skal jeg have skabt en eller anden form for beskrivelse af teksten ved at gemme de forskellige attributter som parseren bestemmer sig frem til - Og dette skal så gemmes i hukommelsen, hvorefter jeg så skal kunne outputte. I øjeblikket er output delen ligegyldig, men derimod parsing delen er rigmelig vigtig.

Jeg overvejede om det system der bruges til at gemme egenskaber om tekst i et tekstbehandlingsprogram kunne bruges, men jeg er faktisk i tvivl om hvordan dette virker.



I min tekst editor foregår det (næsten) det hele i hånden, dvs. manuelt kikke på tegn efter tegn. Dog bruges der regexp til at finde numre.

Her parses teksten for at kunne lave syntax farvning.

Koden til at finde "attributter" fylder ca. 250 linier, den samme kode bruges til alle sprog.



Ja jeg kan se hvad du mener Bertel, men problemet er at jeg i min editor vil smide forskellige systemer ind, og mange af disse skal kun kunne virke på forskellige typer tekst, det kunne være at når man trykkede return inde i en multiline kommentar blok, ville den oprette linjer der starter med en stjerne, og hvis man er uden for, almindelige linjer. Eksempel:
Fold kodeboks ind/udKode 


Altså gøre editorens funktioner afhængige af hvor i teksten min cursor er. Det er lidt svært at forklare, men jeg håber du forstår hvad jeg mener, så det er ikke bare almindelig syntax highlighting jeg vil lave her, det er en editor som er klar over hvad den arejder med af tekst.



Jeg tror godt at jeg fortår hvad du mener.

Jeg tror at det største problem er at definere et antal regler for hvordan editoren skal kunne agere.
Regler det er simple nok til at kunne implementeres og som samtidig er fleksible nok til at kunne "alt".

Når først du har disse regler på plads tror jeg at det er forholdsvist simpelt at implementere dem.



Reglerne er ikke et problem endnu, og de vil, ligesom grammarsne, blive loadet dynamisk, så der kan tilpasses alt efter hvad sprog editoren arbejder med.

Men mit problem lige nu er at min parser skal definere mine "scopes", men jeg har ikke den fjerneste ide om hvordan dette kunne implementeres.



Du vil sikkert have brug for en lang rækker states, nogle af disse vil kunne eksistere på samme tid. En state kunne være om du er inden for en kommentar blok eller inden i en streng.

Til at gemme state kunne man bruge bits i en integer.

Spørgsmålet er måske om du vil opdatere state hver gang du bevæger cursoren eller du vil gemme den sammen med teksten.

Det jeg kalder state er vist det du kalder "scopes"



t