Ik zit even wat scripts door te kijken van anderen, maar ik merk dat veel programmeurs de rare afwijking te hebben 5x meer comments te schrijven dan source code. Vandaar dat ik een programma/functie zoek waarmee ik comments kan verwijderen uit een PHP script. In PHP dus de drie mogelijkheden om commentaar te plaatsen (#, //, /* */) en het liefst niet de strings door te lopen op de tekens.
Verwijderd
waarom zou je commentaar willen verwijderen, ik vind het juist handig als je een lap code van iemand anders heb, om de comments erbij te hebben.
En ik kan vaak sneller PHP code lezen dan boekwerken met commentaar. Ik vind commentaar ook handig, maar soms is het zo slecht/veel dat het gewoon niet hoeft.
Hoe kan een programma nou bepalen welk commentaar wel nuttig is en welke niet. Want bedenk wel, beter teveel dan te weinig
Als je zo goed bent in PHP, dan is het toch gemakkelijk om een scriptje te maken die dat voor je doet?
Klopt, maar ik ga ook niet mijn eigen Photoshop schrijven oidCRiSiS schreef op 13 september 2002 @ 19:03:
Als je zo goed bent in PHP, dan is het toch gemakkelijk om een scriptje te maken die dat voor je doet?
Verwijderd
er zijn geloof ik wel leuke edittors waarmee je commentaar kunt wegklappen ( dat laat hij dan nie zien, maar wel dat daar commentaar stond)
had laats 1 gezien die dat deed maar weet de naam nie..........
had laats 1 gezien die dat deed maar weet de naam nie..........
Je kan met UltraEdit een of meerdere delen in een file laten hiden.Verwijderd schreef op 13 september 2002 @ 20:09:
er zijn geloof ik wel leuke edittors waarmee je commentaar kunt wegklappen ( dat laat hij dan nie zien, maar wel dat daar commentaar stond)
had laats 1 gezien die dat deed maar weet de naam nie..........
Ook Knor is aangestoken met het ligfietsvirus!
Je zou 'm door de C preprocessor kunnen halen, om alle C/C++ style commentaar eruit te strippen. Misschie niet 100% fail safe, maar het komt wel in de buurt.
De meeste grammatica's voor programmeertalen beschouwen commentaar als een soort layout en nemen het dus niet op in de abstract syntax tree die wordt geproduceerd na het parsen van een stuk code.
Je kan dus gewoon op zoek gaan naar een grammatica voor PHP en liefst daarbij dan ook nog een pretty-printer voor PHP die aansluit bij deze grammatica. Het verwijderen van comments komt dan simpelweg neer op het parsen van de code gevolgd door het pretty-printen van de code.
Alle andere oplossingen zijn al snel ad-hoc omdat je voor een degelijke verwijdering van commentaar toch echt een degelijke grammatica nodig hebt. Reguliere expressies zijn heel leuk, maar ongeschikt voor het parsen van volledige programmeertalen.
Je kan dus gewoon op zoek gaan naar een grammatica voor PHP en liefst daarbij dan ook nog een pretty-printer voor PHP die aansluit bij deze grammatica. Het verwijderen van comments komt dan simpelweg neer op het parsen van de code gevolgd door het pretty-printen van de code.
Alle andere oplossingen zijn al snel ad-hoc omdat je voor een degelijke verwijdering van commentaar toch echt een degelijke grammatica nodig hebt. Reguliere expressies zijn heel leuk, maar ongeschikt voor het parsen van volledige programmeertalen.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Het hoeft toch niet zo moeilijk?? Het commentaar is erg simpel te vinden.
van # tot \n, van // to \n en van /* tot */. Het enige vervelende is dat je strings in je source moet negeren
van # tot \n, van // to \n en van /* tot */. Het enige vervelende is dat je strings in je source moet negeren
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
In het geval van PHP moet je ook nog commentaar-achtige tekst in het niet-PHP deel negeren. Daarbij kunnen PHP closing tags ook weer in strings zitten. Al met al is het dus niet zo eenvoudig om het helemaal goed te doen.Janoz schreef op 14 september 2002 @ 00:07:
Het hoeft toch niet zo moeilijk?? Het commentaar is erg simpel te vinden.
van # tot \n, van // to \n en van /* tot */. Het enige vervelende is dat je strings in je source moet negeren
Als je je origenele code bewaart, is die methode waarschijnlijk wel afdoende (en dan zou ik niet zelf iets schrijven maar de C preprocessor pakken), maar ik zou het niet zomaar durven toepassen op kritieke files.
JuistJanoz: Het enige vervelende is dat je strings in je source moet negeren
Er zijn echter nog veel meer complicaties.
Commentaar scheidt bijvoorbeeld tokens. Als je dus het volgende hebt:
code:
1
| int/* */i; |
en je haalt domweg /* */ weg, heb je een probleem. De code was correct, nu niet meer.
Verder is commentaar niet toegestaan in alle andere literals:
code:
1
| float f = 1./** */0 |
Is bijvoorbeeld incorrect. Als je /* */ domweg weg haalt is de code plotseling correct.
Verder mag commentaar over het algemeen niet genest zijn. Dit moet je dus afwijzen:
code:
1
| /* /* */ */ |
Verder moet je nog opletten dat je een */ in een literal niet per ongelijk voor een afsluitend commentaar aanziet (het gaat dus niet alleen om commentaar in een literal.
Al deze complicaties gelden ook voor de // (en nog meer
Je kan al deze zaken af gaan proberen te vangen, maar gegarandeerd dat je iets vergeet. Je tooltje werkt dan misschien voor code die jij verwacht, maar verder is het tooltje niet erg veel waard. Aangezien er toch al smakken grammatica's en pretty-printers zijn, kan je dan beter gelijk een degelijke oplossing kiezen. Het kost waarschijnlijk nog minder tijd dan gepruts met pattern matching.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Zie je het nog zitten om comments te gaan verwijderen?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Hum ... Ik voel me schuldig
. Waarom wil je het niet meer proberen? Proberen kan natuurlijk nooit kwaad en is vast heel leerzaam
.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Het ligt niet aan jou hoor
. Het was handig geweest wanneer zoiets er al was, maar verder wil ik gewoon verder werken aan mijn eigen project.
Met de functie token_get_all is dit makkelijk te doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| // splits de source in tokens $tokens = token_get_all($source); // ga alle tokens langs // voeg toe aan nieuwe source als het geen comment is $newsource = ""; for ($k = 0; $k < count($tokens); $k++){ if (!is_array($tokens[$k])){ $newsource .= $tokens[$k]; } elseif ($tokens[$k][0] != T_COMMENT){ $newsource .= $tokens[$k][1]; } } |
ja das slim..... ipv uitgaan dat je de comments eruit haalt gewoon de source eruit pikken.... nais bed8 sjokkie. wat kan logishc denken toch gaar zijn...
Het maakt niet zo heel erg verschil of je nu de comments eruit vist of de code, wat wel een belangrijk verschil maakt is dat er kennelijk een standaard lexical analyzer (tokenizer) voor PHP in PHP zit. Dit lost veel problemen op, maar niet alles
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
hmm lijkt mij wel dat het uitmaakt aangezien je anders weer gezeur krijgt met of het nu code of comment is right?
Of je nu code uit code+commentaar vist of commentaar uit code+commentaar verwijderd: er zal sowieso bepaald moeten worden of iets commentaar of code is. Dit wordt in de oplossing met de tokenizer bepaald door deze tokenizer.MiezeL: hmm lijkt mij wel dat het uitmaakt aangezien je anders weer gezeur krijgt met of het nu code of comment is right?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
yup. DUS maakt het wel uit welke methode je kiest, toch?
MiezeL schreef op 16 september 2002 @ 02:10:
yup. DUS maakt het wel uit welke methode je kiest, toch?
het concept 'ergens iets uit verwijderen' betekent over het algemeen 'een kopie aanmaken waarin alleen datgene staat wat je niet wilde verwijderen'
Maak jij maar eens een simpele routine in php die alle a's uit een string haalt. Het resultaat is een kopie
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
jah mijn idee. maar daar kwam sjokkie dus mee. daarvoor ging het allemaal nog over eruit slopen ipv eruit rippen. Maare ik ga mezelf niet langer verdedigen:P Neem mijn fort maar lol. kruip ook meteen lekker in mijn eigen Fort. NN all
Pagina: 1