🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
3 messages
3 total messages Started by Bart Vandewoestyne Mon, 09 Sep 2002 20:03
lex probleempje
#7408
Author: Bart Vandewoestyne
Date: Mon, 09 Sep 2002 20:03
109 lines
5046 bytes
Ben hier mijn eerste lex stapjes aan het zetten, en bij wijze van
oefening probeer ik een lexer te maken voor een .html file zoals
geëxporteerd uit een bookmark list van Netscape 4.77.

Alle tags herkennen enzoverder lukt fijn... doch er is één probleem:
ik slaag er niet in om de gewone tekst uit de beschrijving van een URL
of folder te herkennen als text.

Als ik te 'algemeen' ben in mijn regular expression voor die text, dan
gebeurt het dat er ook html tags als text herkend worden, en als ik te
'streng' ben, dan zou het wel eens kunnen gebeuren dat bepaalde tekst
die echt tekst is niet gematcht wordt.

Ik vermoed dat 'start conditions' mij eventueel zouden kunnen helpen,
doch ik heb nog niet goed uitgedokterd hoe ik ze dan best gebruik...
een 'BEGIN TEXT;' zetten bij de rule voor '<' en dan in de rule voor
TEXT terug 'BEGIN 0' zetten lukt precies ook niet...

%{
#include "bookmarks.h"   
%}
%START TEXT
%%
\<![^>]*\>              {
                        printf("COMMENT = %s\n", yytext);
                        }
\<                      {
                        printf("SMALLER = %s\n", yytext);
                        }
\>                      {
                        printf("BIGGER = %s\n", yytext);
                        BEGIN TEXT;
                        }
=                       {
                        printf("EQUAL = %s\n", yytext);
                        }
\"                      {
                        printf("QUOTE = %s\n", yytext);
                        }
\/                      {
                        printf("SLASH = %s\n", yytext);
                        }
\http:\/\/[^\"]*        {
                        printf("URL = %s\n", yytext);
                        }
[0-9]+                  {
                        printf("NUMBER = %s\n", yytext);
                        }
ADD_DATE                {
                        printf("ADD_DATE = %s\n", yytext);
                        }
LAST_MODIFIED           {
                        printf("LAST_MODIFIED = %s\n", yytext);
                        }
LAST_VISIT              {
                        printf("LAST_VISIT = %s\n", yytext);
                        }
FOLDED                  {
                        printf("FOLDED = %s\n", yytext);
                        }
A                       {
                        printf("A = %s\n", yytext);
                        }
HREF                    {
                        printf("HREF = %s\n", yytext);
                        }
H[0-9]*                 {
                        printf("H = %s\n", yytext);
                        }
TITLE                   {
                        printf("TITLE = %s\n", yytext);
                        }
DD                      {
                        printf("DD = %s\n", yytext);
                        }
DL                      {
                        printf("DL = %s\n", yytext);
                        }
DT                      {
                        printf("DT = %s\n", yytext);
                        }
p                       {
                        printf("p = %s\n", yytext);
                        }
<TEXT>[^\<^\>]*         {
                        printf("TEXT = %s\n", yytext);
                        BEGIN 0;
                        }
.                       ;
%%

int yywrap(void) {
  return 1;
}


Hoe los ik dit best/properst op?

Greetzzz,
mc303

-- 
Ing. Bart Vandewoestyne			 Bart.Vandewoestyne@pandora.be
Hugo Verrieststraat 48			       GSM: +32 (0)478 397 697
B-8550 Zwevegem			 http://users.pandora.be/vandewoestyne
----------------------------------------------------------------------
"Any fool can know, the point is to understand." - Albert Einstein
Re: lex probleempje
#7409
Author: Nicolas Barbier
Date: Mon, 09 Sep 2002 23:24
43 lines
2460 bytes
Bart Vandewoestyne wrote:

> Ben hier mijn eerste lex stapjes aan het zetten, en bij wijze van
> oefening probeer ik een lexer te maken voor een .html file zoals
> ge�xporteerd uit een bookmark list van Netscape 4.77.

Ik weet niet hoe zo een bestand eruitziet, maar ik reply toch maar :-).

Een paar (vrij flauwe) opmerkingen:

> \<![^>]*\>              {

Moet > binnen de [] ook niet ge-escaped worden? Het kan wel dat het gewoon
nooit ge-escaped moet worden ;-).

> \http:\/\/[^\"]*        {

Wat doet die \ hier? (Als dat in ANSI C een betekenis heeft, matcht het
iets anders dan je wil).

> <TEXT>[^\<^\>]*         {

Die tweede ^ moet er volgens mij niet staan, en ik denk dat > mag
voorkomen in de gewone tekst (buiten de tags dus) in HTML.

Nu heb ik naar aanleiding van je post even een dingetje gemaakt om een
HTML-achtige syntax te interpreteren. Als je er wat aan hebt, ik heb het
online gezet:

http://www.nicolas.barbier.easynet.be/test.lex

Ik heb het wel enkel getest met flex (lex zit blijkbaar niet bij Debian
main?). Het zal ook wel niet erg leesbaar zijn (vooral de namen van de
start conditions zijn belachelijk ;-). Een test file vind je op:

http://www.nicolas.barbier.easynet.be/test.html

(Ondanks de naam heeft deze file niets met HTML te maken :-).

-- 
Nicolas Barbier
MY_PROFILE:   http://users.pandora.be/HATE/profiles/itsme/
HOW_TO_QUOTE: http://www.houghi.org/quote/ /* Dutch */
Re: lex probleempje
#7418
Author: Bart Vandewoestyne
Date: Tue, 10 Sep 2002 18:55
68 lines
3637 bytes
Nicolas Barbier wrote:
> 
> Ik weet niet hoe zo een bestand eruitziet, maar ik reply toch maar :-).
> 
> Een paar (vrij flauwe) opmerkingen:
> 
> > \<![^>]*\>              {
> 
> Moet > binnen de [] ook niet ge-escaped worden?

Yep, dat lijkt me inderdaad logisch.  Wel raar dat het op deze manier
dan ook werkte...

> > \http:\/\/[^\"]*        {
> 
> Wat doet die \ hier? (Als dat in ANSI C een betekenis heeft, matcht het
> iets anders dan je wil).

Die \ was gewoon een typo en mag er dus inderdaad niet staan :-)

> > <TEXT>[^\<^\>]*         {
> 
> Die tweede ^ moet er volgens mij niet staan, en ik denk dat > mag
> voorkomen in de gewone tekst (buiten de tags dus) in HTML.

Nouja, voorlopig ga ik ervan uitgaan dat mijn tekst geen > mag
bevatten... later kijken we daar dan wel eens naar :-)

> Nu heb ik naar aanleiding van je post even een dingetje gemaakt om een
> HTML-achtige syntax te interpreteren. Als je er wat aan hebt, ik heb het
> online gezet:
> 
> http://www.nicolas.barbier.easynet.be/test.lex

Ik heb je filetje eens vluchtig bekeken en ik zie dat je ook van die
startcondities gebruik maakt.  Dat heeft me aangespoord om daar ook
verder op door te gaan, en ik ben gekomen tot hetgeen staat op:

http://mc303.ulyssis.org/downloads/bookmarks.tar.gz

> Ik heb het wel enkel getest met flex (lex zit blijkbaar niet bij Debian
> main?).

Ik gebruik ook flex hoor:

mc303@forsythe:~/my_programs$ ls -al `which lex`
lrwxrwxrwx    1 root     root            4 Sep 10 17:49 /usr/bin/lex
-> flex

Ik vermoed dat flex compatibel is met lex... dat het enkel eventuele
uitbreidingen bevat.

Wie zin heeft mag mijn lexer gerust testen op zijn bookmarks file, en
mochten er dingen niet juist herkend worden, gelieve me dan de
bookmarkfile door te sturen...

Bon, en nu mijn lexer al tamelijk naar behoren werkt kunnen we
overgaan tot het schrijven van de parser, joepie :-)

Greetzzz,
mc303

-- 
Ing. Bart Vandewoestyne			 Bart.Vandewoestyne@pandora.be
Hugo Verrieststraat 48			       GSM: +32 (0)478 397 697
B-8550 Zwevegem			 http://users.pandora.be/vandewoestyne
----------------------------------------------------------------------
"Any fool can know, the point is to understand." - Albert Einstein
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads