🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.funkcyjne
Article #660

[Bison + flex] Co jesli token spelnia kilka warunkow na raz?

#660
From: Tomasz Pyra
Date: Sun, 09 Jan 2005 21:33
69 lines
3066 bytes
Pisze prosty skanner kodu jezyka C za pomoca Flex-a i Bison-a.

W bisoni-e zdefiniowalem gramatyke opisujaca linie typu #include<stdio.h>

S_INCLUDE: T_INCLUDE T_LESS S_NAME T_MORE

T_INCLUDE oznacza wykrycie ciagu '#include'
T_LESS oznacza znak '<'
T_MORE oznacza znak '>'

i mam klopot ze zdefiniowaniem reguly S_NAME - chodzi o to, zeby 
zalapywaly sie w niej nazwy plikow. Na poczatek zrobilem to tak:

S_NAME: S_NAME_P S_NAME
       | S_NAME_P
;

S_NAME_P: T_DOT
         | T_IDENT
         | T_INTEGER
;

T_IDENT to ciagi znakow [_a-zA-Z][_a-zA-Z0-9]*
T_INTEGER to [0-9]+
T_DOT to znak '.' (kropka)

Pomijajac rozne znaki typu / i \ ktore moga sie znalesc w nazwie pliku 
wszystko wyglada ok.
linia:
#include<stdio.h>
jest dzielona na tokeny '#include' '<' 'stdio' '.' 'h' '>'
if pasuje do reguly gramatyki S_INCLUDE.


Gorzej jak dodam wiecej tokenow (na przyklad T_CHAR ktory wykrywa ciag 
znakow 'char').
Wtedy linia:
#include<char.h>
zostanie podzielona na tokeny '#include' '<' 'char' '.' 'h' '>'
i tu jest problem, bo ciag 'char' nie zostanie zakwalifikowany jak 
T_IDENT, a jako T_CHAR i nie spelni regul S_INCLUDE powodujac blad.


Rozwiazanie czolgowe polegajace na dodaniu wszystkiego co tylko moze 
wystapic do reguly S_NAME_P chyba nie jest wlasciwe.

W pierwszej chwili wymyslilem ze mogl bym po stronie flex-owej wykrywac 
nawiasy <> pomiedzy ktorymi byla by nazwa pliku ale...
Znak < nie zawsze oznacza poczatek nazwy w dyrektywie #include, wiec 
znak < musi byc osobnym tokenem T_LESS.


Na to wszystko przemyslalem sprawe innego skladnika jezyka C - dyrektywy 
#define, ktora sklada sie ze slowa #define, identyfikatora i tego czym 
identyfikator zastapic.
I jak tu teraz do tego podejsc?
S_DEFINE: T_DEFINE T_IDENT S_COKOLWIEK

T_DEFINE wykrywa ciag #define
T_IDENT to [_a-zA-Z][_a-zA-Z0-9]*

i jak zabrac sie do definiowania S_COKOLWIEK? Musialo to by byc cos, co 
pozwala na wprowadzenie dowolnych znakow, az do konca linii (no chyba ze 
na koncu linii wystepuje \)

W zasadzie dobre moglo by byc chwilowe przelaczenie flex-a w jakis stan 
zdefiniowany przez %x, tylko nie wiem czy da sie tak zrobic.

Jako zielony bisonowiec prosze o pomoc.
Technical Details
Message-ID: <crs86d$3jh$1@nemesis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Tomasz Pyra <spam@spam.spam.pl>
Newsgroups: pl.comp.lang.funkcyjne
Subject: [Bison + flex] Co jesli token spelnia kilka warunkow na raz?
Date: Sun, 09 Jan 2005 22:33:26 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 69
Message-ID: <crs86d$3jh$1@nemesis.news.tpi.pl>
NNTP-Posting-Host: aip192.neoplus.adsl.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1105306638 3697 83.25.223.192 (9 Jan 2005 21:37:18 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Sun, 9 Jan 2005 21:37:18 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0 (X11/20041206)
X-Accept-Language: pl, en-us, en
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit