🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.funkcyjne
3 messages
3 total messages Started by Tomasz Pyra Sun, 09 Jan 2005 21:33
[Bison + flex] Co jesli token spelnia kilka warunkow na raz?
#660
Author: 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.
Re: [Bison + flex] Co jesli token spelnia kilka warunkow na raz?
#661
Author: Marcin 'Qrczak' Kowalczyk
Date: Sun, 09 Jan 2005 21:55
12 lines
1504 bytes
Tomasz Pyra <spam@spam.spam.pl> writes:

> 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.

info '(flex)Start conditions'

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Re: [Bison + flex] Co jesli token spelnia kilka warunkow na raz?
#662
Author: Adam Przybyla
Date: Sun, 09 Jan 2005 23:02
9 lines
1300 bytes
Tomasz Pyra <spam@spam.spam.pl> wrote:
> 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
	... sproboj wpakowac regule opisujaca zmienna przed regule opisujaca ciag
znakow. Z powazaniem
								Adam Przybyla
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