Article View: pl.comp.lang.funkcyjne
Article #660[Bison + flex] Co jesli token spelnia kilka warunkow na raz?
From: Tomasz Pyra
Date: Sun, 09 Jan 2005 21:33
Date: Sun, 09 Jan 2005 21:33
69 lines
3066 bytes
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-mailShow 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