2008-02-03 11:28:36 +01:00
/ *
2015-02-18 04:00:11 +01:00
* C o p y r i g h t ( C ) 2008 -2015 D y n a r e T e a m
2008-02-03 11:28:36 +01:00
*
* T h i s f i l e i s p a r t o f D y n a r e .
*
* D y n a r e i s free software: y o u c a n r e d i s t r i b u t e i t and / or m o d i f y
* i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d b y
* t h e F r e e S o f t w a r e F o u n d a t i o n , e i t h e r v e r s i o n 3 o f t h e L i c e n s e , or
* ( a t y o u r o p t i o n ) any l a t e r v e r s i o n .
*
* D y n a r e i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l ,
* b u t W I T H O U T A N Y W A R R A N T Y ; without even the implied warranty of
* M E R C H A N T A B I L I T Y or F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e
* G N U G e n e r a l P u b l i c L i c e n s e f or m o r e d e t a i l s .
*
* Y o u s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* a l o n g w i t h D y n a r e . I f n o t , s e e < http: / / w w w . g n u . o r g / l i c e n s e s / > .
* /
% {
u s i n g n a m e s p a c e s t d ;
# i n c l u d e < f s t r e a m >
# i n c l u d e "MacroDriver.hh"
/ / A n n o u n c e to F l e x t h e p r o t o type w e w a n t f or l e x i n g f u n c t i o n
# define Y Y _ D E C L \
Macro: : parser: : token _ type \
MacroFlex: : l e x ( Macro: : parser: : s e m a n t i c _ type * y y l v a l , \
Macro: : parser: : l o c a t i o n _ type * y y l l o c , \
M a c r o D r i v e r & d r i v e r )
/ / S h o r t c u t to a c c e s s token s d e f i n e d b y B i s o n
t y p e d e f Macro: : parser: : token token ;
/ * B y default y y l e x r e t u r n s i n t , w e u s e token _ type .
U n f o r t u n a t e l y y y t e r m i n a t e b y default r e t u r n s 0 , w h i c h i s
n o t o f token _ type . * /
# define y y t e r m i n a t e ( ) r e t u r n Macro: : parser: : token _ type ( 0 ) ;
% }
%option c + +
%option prefix = "Macro"
%option c a s e - i n s e n s i t i v e n o y y w r a p n o u n p u t b a t c h d e b u g n e v e r - i n t e r a c t i v e
2008-04-04 16:57:01 +02:00
%x S T M T
%x E X P R
2008-02-29 17:21:01 +01:00
%x F O R _ B O D Y
2008-03-07 16:58:35 +01:00
%x T H E N _ B O D Y
%x E L S E _ B O D Y
2008-02-03 11:28:36 +01:00
% {
/ / I n c r e m e n t s l o c a t i o n c o u n t e r f or e v e r y token r e a d
# define Y Y _ U S E R _ A C T I O N y y l l o c - > c o l u m n s ( y y l e n g ) ;
% }
2008-03-07 16:58:35 +01:00
S P C [ \ t ] +
E O L ( \ r ) ? \ n
2008-04-02 09:40:09 +02:00
C O N T \ \ \ \
2008-03-07 16:58:35 +01:00
2008-02-03 11:28:36 +01:00
% %
/ * C o d e p u t a t t h e b e g i n n i n g o f y y l e x ( ) * /
% {
/ / R e s e t l o c a t i o n b e f o r e r e a d i n g token
y y l l o c - > s t e p ( ) ;
% }
2008-04-10 10:16:54 +02:00
< I N I T I A L > ^ { S P C } * @ # { S P C } * i n c l u d e { S P C } + \ "[^\" \ r \ n ] * \ " { S P C } * { E O L } {
2008-03-07 16:58:35 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
/ / G e t f i l e n a m e
s t r i n g * f i l e n a m e = n e w s t r i n g ( y y t e x t ) ;
i n t d b l q _ i d x 1 = f i l e n a m e - > f i n d ( ' " ' ) ;
i n t d b l q _ i d x 2 = f i l e n a m e - > f i n d ( ' " ' , d b l q _ i d x 1 + 1 ) ;
f i l e n a m e - > e r a s e ( d b l q _ i d x 2 ) ;
f i l e n a m e - > e r a s e ( 0 , d b l q _ i d x 1 + 1 ) ;
c r e a t e _ i n c l u d e _ c o n t e x t ( f i l e n a m e , y y l l o c , d r i v e r ) ;
B E G I N ( I N I T I A L ) ;
2008-02-03 11:28:36 +01:00
}
2015-02-24 14:41:29 +01:00
< I N I T I A L > ^ { S P C } * @ # { S P C } * i n c l u d e { S P C } + [ ^ \ " \ r \ n ] * { S P C } * { E O L } {
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
/ / G e t v a r i a b l e n a m e
2015-02-25 09:03:48 +01:00
s t r i n g m o d v a r n a m e = s t r i n g ( y y t e x t ) ;
i n t d b l q _ i d x 1 = m o d v a r n a m e . f i n d ( "include" ) ;
m o d v a r n a m e . e r a s e ( 0 , d b l q _ i d x 1 + 7 ) ;
m o d v a r n a m e . e r a s e ( 0 , m o d v a r n a m e . f i n d _ f i r s t _ n o t _ o f ( " \t" ) ) ;
s i z e _ t p = m o d v a r n a m e . f i n d _ l a s t _ n o t _ o f ( " \t\n\r" ) ;
2015-02-24 14:41:29 +01:00
i f ( string: : n p o s ! = p )
2015-02-25 09:03:48 +01:00
m o d v a r n a m e . e r a s e ( p + 1 ) ;
2015-02-24 14:41:29 +01:00
2015-02-25 09:03:48 +01:00
s t r i n g * f i l e n a m e = N U L L ;
2015-02-24 14:41:29 +01:00
t r y
{
2015-02-25 09:03:48 +01:00
f i l e n a m e = n e w s t r i n g ( d r i v e r . g e t _ v a r i a b l e ( m o d v a r n a m e ) - > t o S t r i n g ( ) ) ;
2015-02-24 14:41:29 +01:00
}
catch ( MacroDriver: : U n k n o w n V a r i a b l e ( & e ) )
{
2015-02-25 09:03:48 +01:00
d r i v e r . e r r or ( * y y l l o c , "Unknown variable: " + m o d v a r n a m e ) ;
2015-02-24 14:41:29 +01:00
}
c r e a t e _ i n c l u d e _ c o n t e x t ( f i l e n a m e , y y l l o c , d r i v e r ) ;
B E G I N ( I N I T I A L ) ;
}
2008-04-10 10:16:54 +02:00
< I N I T I A L > ^ { S P C } * @ # { y y l l o c - > s t e p ( ) ; BEGIN(STMT); }
< I N I T I A L > @ \ { { y y l l o c - > s t e p ( ) ; BEGIN(EXPR); }
2008-03-28 12:10:28 +01:00
2008-04-04 16:57:01 +02:00
< E X P R > \ } { B E G I N ( I N I T I A L ) ; return token::EOL; }
2008-02-15 18:31:40 +01:00
2008-04-04 16:57:01 +02:00
< S T M T > { C O N T } { S P C } * { E O L } { y y l l o c - > l i n e s ( 1 ) ; yylloc->step(); }
< S T M T > { E O L } {
2008-12-09 17:13:03 +01:00
/ * I f p a r s i n g a @ # f or or a n @ # i f , k e e p t h e l o c a t i o n
f or r e p o r t i n g m e s s a g e i n c a s e o f e r r or * /
i f ( r e a d i n g _ f o r _ s t a t e m e n t )
f o r _ s t m t _ l o c _ t m p = * y y l l o c ;
e l s e i f ( r e a d i n g _ i f _ s t a t e m e n t )
i f _ s t m t _ l o c _ t m p = * y y l l o c ;
2008-02-29 17:21:01 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
i f ( r e a d i n g _ f o r _ s t a t e m e n t )
{
r e a d i n g _ f o r _ s t a t e m e n t = false ;
f o r _ b o d y _ t m p . e r a s e ( ) ;
f o r _ b o d y _ l o c _ t m p = * y y l l o c ;
n e s t e d _ f o r _ n b = 0 ;
B E G I N ( F O R _ B O D Y ) ;
}
2008-03-07 16:58:35 +01:00
e l s e i f ( r e a d i n g _ i f _ s t a t e m e n t )
{
r e a d i n g _ i f _ s t a t e m e n t = false ;
t h e n _ b o d y _ t m p . e r a s e ( ) ;
t h e n _ b o d y _ l o c _ t m p = * y y l l o c ;
n e s t e d _ i f _ n b = 0 ;
B E G I N ( T H E N _ B O D Y ) ;
}
2008-02-29 17:21:01 +01:00
e l s e
2008-03-07 16:58:35 +01:00
{
* y y o u t < < e n d l ;
B E G I N ( I N I T I A L ) ;
}
2008-02-29 17:21:01 +01:00
r e t u r n token: : E O L ;
}
2008-02-15 18:31:40 +01:00
2008-04-04 16:57:01 +02:00
< S T M T , E X P R > { S P C } + { y y l l o c - > s t e p ( ) ; }
< S T M T , E X P R > [ 0 -9 ] + {
2008-02-15 18:31:40 +01:00
y y l v a l - > i n t _ v a l = a t o i ( y y t e x t ) ;
r e t u r n token: : I N T E G E R ;
}
2008-04-04 16:57:01 +02:00
< S T M T , E X P R > \ ( { r e t u r n token: : L P A R E N ; }
< S T M T , E X P R > \ ) { r e t u r n token: : R P A R E N ; }
< S T M T , E X P R > \ [ { r e t u r n token: : L B R A C K E T ; }
< S T M T , E X P R > \ ] { r e t u r n token: : R B R A C K E T ; }
< S T M T , E X P R > : { r e t u r n token: : C O L O N ; }
< S T M T , E X P R > , { r e t u r n token: : C O M M A ; }
< S T M T , E X P R > = { r e t u r n token: : E Q U A L ; }
< S T M T , E X P R > [ ! ] { r e t u r n token: : E X C L A M A T I O N ; }
< S T M T , E X P R > "||" { r e t u r n token: : L O G I C A L _ O R ; }
< S T M T , E X P R > & & { r e t u r n token: : L O G I C A L _ A N D ; }
< S T M T , E X P R > "<=" { r e t u r n token: : L E S S _ E Q U A L ; }
< S T M T , E X P R > ">=" { r e t u r n token: : G R E A T E R _ E Q U A L ; }
< S T M T , E X P R > "<" { r e t u r n token: : L E S S ; }
< S T M T , E X P R > ">" { r e t u r n token: : G R E A T E R ; }
< S T M T , E X P R > "==" { r e t u r n token: : E Q U A L _ E Q U A L ; }
< S T M T , E X P R > "!=" { r e t u r n token: : E X C L A M A T I O N _ E Q U A L ; }
< S T M T , E X P R > [ + ] { r e t u r n token: : P L U S ; }
< S T M T , E X P R > [ - ] { r e t u r n token: : M I N U S ; }
< S T M T , E X P R > [ * ] { r e t u r n token: : T I M E S ; }
< S T M T , E X P R > [ / ] { r e t u r n token: : D I V I D E ; }
2008-12-08 16:13:08 +01:00
< S T M T , E X P R > i n { r e t u r n token: : I N ; }
2013-08-12 23:24:47 +02:00
< S T M T , E X P R > l e n g t h { r e t u r n token: : L E N G T H ; }
2008-04-04 16:57:01 +02:00
< S T M T , E X P R > \ "[^\" ] * \ " {
2008-02-15 18:31:40 +01:00
y y l v a l - > s t r i n g _ v a l = n e w s t r i n g ( y y t e x t + 1 ) ;
y y l v a l - > s t r i n g _ v a l - > r e s i z e ( y y l v a l - > s t r i n g _ v a l - > l e n g t h ( ) - 1 ) ;
r e t u r n token: : S T R I N G ;
}
2008-04-04 16:57:01 +02:00
< S T M T > l i ne { r e t u r n token: : L I N E ; }
< S T M T > define { r e t u r n token: : D E F I N E ; }
2008-03-07 16:58:35 +01:00
2008-04-04 16:57:01 +02:00
< S T M T > f or { r e a d i n g _ f o r _ s t a t e m e n t = true ; return token::FOR; }
2008-04-10 10:16:54 +02:00
< S T M T > e n d f or { d r i v e r . e r r or ( * y y l l o c , "@#endfor is not matched by a @#for statement" ) ; }
2008-02-15 18:31:40 +01:00
2012-01-02 18:08:14 +01:00
< S T M T > i f d e f { r e a d i n g _ i f _ s t a t e m e n t = true ; return token::IFDEF; }
2012-06-26 15:12:31 +02:00
< S T M T > i f n d e f { r e a d i n g _ i f _ s t a t e m e n t = true ; return token::IFNDEF; }
2012-01-02 18:08:14 +01:00
2008-04-04 16:57:01 +02:00
< S T M T > i f { r e a d i n g _ i f _ s t a t e m e n t = true ; return token::IF; }
2012-06-26 15:12:31 +02:00
< S T M T > e l s e { d r i v e r . e r r or ( * y y l l o c , "@#else is not matched by an @#if/@#ifdef/@#ifndef statement" ) ; }
< S T M T > e n d i f { d r i v e r . e r r or ( * y y l l o c , "@#endif is not matched by an @#if/@#ifdef/@#ifndef statement" ) ; }
2008-03-07 16:58:35 +01:00
2008-04-04 16:57:01 +02:00
< S T M T > e c h o { r e t u r n token: : E C H O _ D I R ; }
< S T M T > e r r or { r e t u r n token: : E R R O R ; }
2008-03-07 16:58:35 +01:00
2008-04-04 16:57:01 +02:00
< S T M T , E X P R > [ A - Z a - z _ ] [ A - Z a - z 0 -9 _ ] * {
2008-03-07 16:58:35 +01:00
y y l v a l - > s t r i n g _ v a l = n e w s t r i n g ( y y t e x t ) ;
r e t u r n token: : N A M E ;
}
2008-02-15 18:31:40 +01:00
2008-04-04 16:57:01 +02:00
< E X P R > < < E O F > > { d r i v e r . e r r or ( * y y l l o c , "Unexpected end of file while parsing a macro expression" ) ; }
< S T M T > < < E O F > > { d r i v e r . e r r or ( * y y l l o c , "Unexpected end of file while parsing a macro statement" ) ; }
2008-02-29 17:21:01 +01:00
2008-03-07 16:58:35 +01:00
< F O R _ B O D Y > { E O L } { y y l l o c - > l i n e s ( 1 ) ; yylloc->step(); for_body_tmp.append(yytext); }
2008-04-10 10:16:54 +02:00
< F O R _ B O D Y > ^ { S P C } * @ # { S P C } * f or ( { S P C } | { C O N T } ) {
2008-04-02 09:40:09 +02:00
n e s t e d _ f o r _ n b + + ;
f o r _ b o d y _ t m p . a p p end ( y y t e x t ) ;
2008-04-04 16:57:01 +02:00
y y l l o c - > s t e p ( ) ;
2008-04-02 09:40:09 +02:00
}
2008-04-04 16:57:01 +02:00
< F O R _ B O D Y > . { f o r _ b o d y _ t m p . a p p end ( y y t e x t ) ; yylloc->step(); }
2015-02-18 03:54:31 +01:00
< F O R _ B O D Y > < < E O F > > { d r i v e r . e r r or ( f o r _ s t m t _ l o c _ t m p , "@#for loop not matched by an @#endfor or file does not end with a new line (unexpected end of file)" ) ; }
2009-02-05 00:24:16 +01:00
< F O R _ B O D Y > ^ { S P C } * @ # { S P C } * e n d f or { S P C } * ( \ / \ / . * ) ? { E O L } {
2008-03-07 16:58:35 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
i f ( n e s t e d _ f o r _ n b )
{
2008-04-10 10:16:54 +02:00
/ * T h i s @ # e n d f or i s n o t t h e end o f t h e l o o p b o d y ,
b u t o n l y t h a t o f a n e s t e d @ # f or l o o p * /
2008-03-07 16:58:35 +01:00
n e s t e d _ f o r _ n b - - ;
f o r _ b o d y _ t m p . a p p end ( y y t e x t ) ;
}
e l s e
{
2009-02-06 16:47:26 +01:00
/ / S w i t c h to l o o p b o d y c o n t e x t , e x c e p t i f i t e r a t i n g o v e r a n e m p t y a r r a y
i f ( d r i v e r . i t e r _ l o o p ( ) )
{
/ / S a v e o l d b u f f e r s t a t e and l o c a t i o n
s a v e _ c o n t e x t ( y y l l o c ) ;
2008-03-07 16:58:35 +01:00
2009-02-06 16:47:26 +01:00
i s _ f o r _ c o n t e x t = true ;
f o r _ b o d y = f o r _ b o d y _ t m p ;
f o r _ b o d y _ l o c = f o r _ b o d y _ l o c _ t m p ;
2008-03-07 16:58:35 +01:00
2009-02-06 16:47:26 +01:00
n e w _ l o o p _ b o d y _ b u f f e r ( y y l l o c ) ;
}
2008-03-07 16:58:35 +01:00
B E G I N ( I N I T I A L ) ;
}
}
< T H E N _ B O D Y > { E O L } { y y l l o c - > l i n e s ( 1 ) ; yylloc->step(); then_body_tmp.append(yytext); }
2008-04-10 10:16:54 +02:00
< T H E N _ B O D Y > ^ { S P C } * @ # { S P C } * i f ( { S P C } | { C O N T } ) {
2008-04-02 09:40:09 +02:00
n e s t e d _ i f _ n b + + ;
t h e n _ b o d y _ t m p . a p p end ( y y t e x t ) ;
2008-04-04 16:57:01 +02:00
y y l l o c - > s t e p ( ) ;
2008-04-02 09:40:09 +02:00
}
2008-04-04 16:57:01 +02:00
< T H E N _ B O D Y > . { t h e n _ b o d y _ t m p . a p p end ( y y t e x t ) ; yylloc->step(); }
2015-02-18 03:54:31 +01:00
< T H E N _ B O D Y > < < E O F > > { d r i v e r . e r r or ( i f _ s t m t _ l o c _ t m p , "@#if/@#ifdef/@#ifndef not matched by an @#endif or file does not end with a new line (unexpected end of file)" ) ; }
2009-02-05 00:42:48 +01:00
< T H E N _ B O D Y > ^ { S P C } * @ # { S P C } * e l s e { S P C } * ( \ / \ / . * ) ? { E O L } {
2008-03-07 16:58:35 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
i f ( n e s t e d _ i f _ n b )
t h e n _ b o d y _ t m p . a p p end ( y y t e x t ) ;
e l s e
{
e l s e _ b o d y _ t m p . e r a s e ( ) ;
e l s e _ b o d y _ l o c _ t m p = * y y l l o c ;
B E G I N ( E L S E _ B O D Y ) ;
}
}
2009-02-05 00:24:16 +01:00
< T H E N _ B O D Y > ^ { S P C } * @ # { S P C } * e n d i f { S P C } * ( \ / \ / . * ) ? { E O L } {
2008-03-07 16:58:35 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
i f ( n e s t e d _ i f _ n b )
{
2008-04-10 10:16:54 +02:00
/ * T h i s @ # e n d i f i s n o t t h e end o f t h e @ # i f w e ' r e p a r s i n g ,
b u t o n l y t h a t o f a n e s t e d @ # i f * /
2008-03-07 16:58:35 +01:00
n e s t e d _ i f _ n b - - ;
t h e n _ b o d y _ t m p . a p p end ( y y t e x t ) ;
}
e l s e
{
i f ( d r i v e r . l a s t _ i f )
c r e a t e _ t h e n _ c o n t e x t ( y y l l o c ) ;
e l s e
o u t p u t _ l i ne ( y y l l o c ) ;
B E G I N ( I N I T I A L ) ;
}
}
< E L S E _ B O D Y > { E O L } { y y l l o c - > l i n e s ( 1 ) ; yylloc->step(); else_body_tmp.append(yytext); }
2008-04-10 10:16:54 +02:00
< E L S E _ B O D Y > ^ { S P C } * @ # { S P C } * i f ( { S P C } | { C O N T } ) {
2008-04-02 09:40:09 +02:00
n e s t e d _ i f _ n b + + ;
e l s e _ b o d y _ t m p . a p p end ( y y t e x t ) ;
2008-04-04 16:57:01 +02:00
y y l l o c - > s t e p ( ) ;
2008-04-02 09:40:09 +02:00
}
2008-04-04 16:57:01 +02:00
< E L S E _ B O D Y > . { e l s e _ b o d y _ t m p . a p p end ( y y t e x t ) ; yylloc->step(); }
2015-02-18 03:54:31 +01:00
< E L S E _ B O D Y > < < E O F > > { d r i v e r . e r r or ( i f _ s t m t _ l o c _ t m p , "@#if/@#ifdef/@#ifndef not matched by an @#endif or file does not end with a new line (unexpected end of file)" ) ; }
2008-03-07 16:58:35 +01:00
2009-02-05 00:24:16 +01:00
< E L S E _ B O D Y > ^ { S P C } * @ # { S P C } * e n d i f { S P C } * ( \ / \ / . * ) ? { E O L } {
2008-03-07 16:58:35 +01:00
y y l l o c - > l i n e s ( 1 ) ;
y y l l o c - > s t e p ( ) ;
i f ( n e s t e d _ i f _ n b )
{
2008-04-10 10:16:54 +02:00
/ * T h i s @ # e n d i f i s n o t t h e end o f t h e @ # i f w e ' r e p a r s i n g ,
b u t o n l y t h a t o f a n e s t e d @ # i f * /
2008-03-07 16:58:35 +01:00
n e s t e d _ i f _ n b - - ;
e l s e _ b o d y _ t m p . a p p end ( y y t e x t ) ;
}
e l s e
{
i f ( d r i v e r . l a s t _ i f )
c r e a t e _ t h e n _ c o n t e x t ( y y l l o c ) ;
e l s e
c r e a t e _ e l s e _ c o n t e x t ( y y l l o c ) ;
B E G I N ( I N I T I A L ) ;
}
}
2008-02-15 18:31:40 +01:00
2008-02-29 17:21:01 +01:00
< I N I T I A L > < < E O F > > {
2008-02-03 11:28:36 +01:00
/ / Q u i t l e x e r i f end o f m a i n f i l e
2008-02-29 17:21:01 +01:00
i f ( c o n t e x t _ s t a c k . e m p t y ( ) )
2008-02-03 11:28:36 +01:00
{
y y t e r m i n a t e ( ) ;
}
2008-03-07 16:58:35 +01:00
2008-02-29 17:21:01 +01:00
/ / E l s e c l e a n c u r r e n t s c a n n i n g c o n t e x t
2008-02-03 11:28:36 +01:00
y y _ d e l e t e _ b u f f e r ( Y Y _ C U R R E N T _ B U F F E R ) ;
2008-02-29 17:21:01 +01:00
d e l e t e i n p u t ;
2008-02-03 11:28:36 +01:00
d e l e t e y y l l o c - > begin . f i l e n a m e ;
2008-02-29 17:21:01 +01:00
2008-03-07 16:58:35 +01:00
/ * I f w e a r e n o t i n a l o o p b o d y , or i f t h e l o o p h a s t e r m i n a t e d ,
p o p a c o n t e x t * /
2009-02-06 16:47:26 +01:00
i f ( i s _ f o r _ c o n t e x t & & d r i v e r . i t e r _ l o o p ( ) )
n e w _ l o o p _ b o d y _ b u f f e r ( y y l l o c ) ;
e l s e
2008-03-07 16:58:35 +01:00
r e s t o r e _ c o n t e x t ( y y l l o c ) ;
2008-02-03 11:28:36 +01:00
}
2008-04-04 16:57:01 +02:00
/ * W e d o n ' t u s e e c h o , b e c a u s e u n d e r C y g w i n i t w i l l add a n e x t r a \ r * /
< I N I T I A L > { E O L } { y y l l o c - > l i n e s ( 1 ) ; yylloc->step(); *yyout << endl; }
2008-02-19 15:24:40 +01:00
2008-02-08 14:10:10 +01:00
/ * C o p y e v e r y t h i n g e l s e to o u t p u t * /
2008-02-03 11:28:36 +01:00
< I N I T I A L > . { y y l l o c - > s t e p ( ) ; ECHO; }
< * > . { d r i v e r . e r r or ( * y y l l o c , "Macro lexer error: '" + s t r i n g ( y y t e x t ) + "'" ) ; }
% %
2009-01-21 14:45:44 +01:00
MacroFlex: : M a c r o F l e x ( i s t r e a m * i n , o s t r e a m * o u t , b o o l n o _ l i n e _ m a c r o _ a r g )
: M a c r o F l e x L e x e r ( i n , o u t ) , i n p u t ( i n ) , n o _ l i n e _ m a c r o ( n o _ l i n e _ m a c r o _ a r g ) ,
r e a d i n g _ f o r _ s t a t e m e n t ( false ) , r e a d i n g _ i f _ s t a t e m e n t ( false )
2008-02-29 17:21:01 +01:00
{
}
void
2008-03-07 16:58:35 +01:00
MacroFlex: : o u t p u t _ l i ne ( Macro: : parser: : l o c a t i o n _ type * y y l l o c ) c o n s t
2008-02-03 11:28:36 +01:00
{
2009-01-21 14:45:44 +01:00
i f ( !no_line_macro )
* y y o u t < < e n d l < < "@#line \" " << *yylloc->begin.filename << " \ " "
< < y y l l o c - > begin . l i ne < < e n d l ;
2008-02-29 17:21:01 +01:00
}
2008-03-07 16:58:35 +01:00
void
MacroFlex: : s a v e _ c o n t e x t ( Macro: : parser: : l o c a t i o n _ type * y y l l o c )
{
2009-02-05 16:54:09 +01:00
c o n t e x t _ s t a c k . p u s h ( S c a n C o n t e x t ( i n p u t , Y Y _ C U R R E N T _ B U F F E R , * y y l l o c , i s _ f o r _ c o n t e x t ,
f o r _ b o d y , f o r _ b o d y _ l o c ) ) ;
2008-03-07 16:58:35 +01:00
}
void
MacroFlex: : r e s t o r e _ c o n t e x t ( Macro: : parser: : l o c a t i o n _ type * y y l l o c )
{
i n p u t = c o n t e x t _ s t a c k . t o p ( ) . i n p u t ;
y y _ s w i t c h _ t o _ b u f f e r ( c o n t e x t _ s t a c k . t o p ( ) . b u f f e r ) ;
* y y l l o c = c o n t e x t _ s t a c k . t o p ( ) . y y l l o c ;
2009-02-05 16:54:09 +01:00
i s _ f o r _ c o n t e x t = c o n t e x t _ s t a c k . t o p ( ) . i s _ f o r _ c o n t e x t ;
2008-03-07 16:58:35 +01:00
f o r _ b o d y = c o n t e x t _ s t a c k . t o p ( ) . f o r _ b o d y ;
f o r _ b o d y _ l o c = c o n t e x t _ s t a c k . t o p ( ) . f o r _ b o d y _ l o c ;
/ / R e m o v e t o p o f s t a c k
c o n t e x t _ s t a c k . p o p ( ) ;
2008-04-10 10:16:54 +02:00
/ / D u m p @ # l i ne i n s t r u c t i o n
2008-03-07 16:58:35 +01:00
o u t p u t _ l i ne ( y y l l o c ) ;
}
void
MacroFlex: : c r e a t e _ i n c l u d e _ c o n t e x t ( s t r i n g * f i l e n a m e , Macro: : parser: : l o c a t i o n _ type * y y l l o c ,
M a c r o D r i v e r & d r i v e r )
{
s a v e _ c o n t e x t ( y y l l o c ) ;
/ / O p e n n e w f i l e
i n p u t = n e w i f s t r e a m ( f i l e n a m e - > c _ s t r ( ) , ios: : b i n a r y ) ;
i f ( i n p u t - > f a i l ( ) )
d r i v e r . e r r or ( * y y l l o c , "Could not open " + * f i l e n a m e ) ;
/ / R e s e t l o c a t i o n
y y l l o c - > begin . f i l e n a m e = y y l l o c - > end . f i l e n a m e = f i l e n a m e ;
y y l l o c - > begin . l i ne = y y l l o c - > end . l i ne = 1 ;
y y l l o c - > begin . c o l u m n = y y l l o c - > end . c o l u m n = 0 ;
/ / W e a r e n o t i n a l o o p b o d y
2009-02-05 16:54:09 +01:00
i s _ f o r _ c o n t e x t = false ;
2008-03-07 16:58:35 +01:00
f o r _ b o d y . c l e a r ( ) ;
2008-04-10 10:16:54 +02:00
/ / O u t p u t @ # l i ne i n f o r m a t i o n
2008-03-07 16:58:35 +01:00
o u t p u t _ l i ne ( y y l l o c ) ;
/ / S w i t c h to n e w b u f f e r
y y _ s w i t c h _ t o _ b u f f e r ( y y _ c r e a t e _ b u f f e r ( i n p u t , Y Y _ B U F _ S I Z E ) ) ;
}
void
MacroFlex: : c r e a t e _ t h e n _ c o n t e x t ( Macro: : parser: : l o c a t i o n _ type * y y l l o c )
{
s a v e _ c o n t e x t ( y y l l o c ) ;
i n p u t = n e w s t r i n g s t r e a m ( t h e n _ b o d y _ t m p ) ;
* y y l l o c = t h e n _ b o d y _ l o c _ t m p ;
y y l l o c - > begin . f i l e n a m e = y y l l o c - > end . f i l e n a m e = n e w s t r i n g ( * t h e n _ b o d y _ l o c _ t m p . begin . f i l e n a m e ) ;
2009-02-05 16:54:09 +01:00
i s _ f o r _ c o n t e x t = false ;
2008-03-07 16:58:35 +01:00
f o r _ b o d y . c l e a r ( ) ;
o u t p u t _ l i ne ( y y l l o c ) ;
y y _ s w i t c h _ t o _ b u f f e r ( y y _ c r e a t e _ b u f f e r ( i n p u t , Y Y _ B U F _ S I Z E ) ) ;
}
void
MacroFlex: : c r e a t e _ e l s e _ c o n t e x t ( Macro: : parser: : l o c a t i o n _ type * y y l l o c )
{
s a v e _ c o n t e x t ( y y l l o c ) ;
i n p u t = n e w s t r i n g s t r e a m ( e l s e _ b o d y _ t m p ) ;
* y y l l o c = e l s e _ b o d y _ l o c _ t m p ;
y y l l o c - > begin . f i l e n a m e = y y l l o c - > end . f i l e n a m e = n e w s t r i n g ( * e l s e _ b o d y _ l o c _ t m p . begin . f i l e n a m e ) ;
2009-02-05 16:54:09 +01:00
i s _ f o r _ c o n t e x t = false ;
2008-03-07 16:58:35 +01:00
f o r _ b o d y . c l e a r ( ) ;
o u t p u t _ l i ne ( y y l l o c ) ;
y y _ s w i t c h _ t o _ b u f f e r ( y y _ c r e a t e _ b u f f e r ( i n p u t , Y Y _ B U F _ S I Z E ) ) ;
}
2009-02-06 16:47:26 +01:00
void
MacroFlex: : n e w _ l o o p _ b o d y _ b u f f e r ( Macro: : parser: : l o c a t i o n _ type * y y l l o c )
2008-02-29 17:21:01 +01:00
{
i n p u t = n e w s t r i n g s t r e a m ( f o r _ b o d y ) ;
* y y l l o c = f o r _ b o d y _ l o c ;
y y l l o c - > begin . f i l e n a m e = y y l l o c - > end . f i l e n a m e = n e w s t r i n g ( * f o r _ b o d y _ l o c . begin . f i l e n a m e ) ;
o u t p u t _ l i ne ( y y l l o c ) ;
y y _ s w i t c h _ t o _ b u f f e r ( y y _ c r e a t e _ b u f f e r ( i n p u t , Y Y _ B U F _ S I Z E ) ) ;
2008-02-03 11:28:36 +01:00
}
/ * T h i s i m p l e m e n t a t i o n o f MacroFlexLexer: : y y l e x ( ) i s r e q u i r e d to f i l l t h e
* v t a b l e o f t h e c l a s s M a c r o F l e x L e x e r . W e define t h e s c a n n e r ' s m a i n y y l e x
* f u n c t i o n v i a Y Y _ D E C L to r e s i d e i n t h e M a c r o F l e x c l a s s i n s t e a d . * /
# i f d e f y y l e x
# undef y y l e x
# e n d i f
i n t
MacroFlexLexer: : y y l e x ( )
{
c e r r < < "MacroFlexLexer::yylex() has been called, that should never happen!" < < e n d l ;
2008-10-29 16:33:16 +01:00
e x i t ( E X I T _ F A I L U R E ) ;
2008-02-03 11:28:36 +01:00
}