Monitor 1
HStack # All Window
(
VStack 3 # Region A
(
Window 2 # Region C
HStack # Region D
(
Window # Region E
Window # Region F
Window # Region G
)
)
VStack # Region B
(
Window # Region H
Window # Region I
Window # Region J
)
)
/*<br/>
* GridStack.lex<br/>
*/ <br/>
<br/>
% { <br/>
#include <stdio.h> <br/>
#include <string.h> <br/>
#include <malloc.h> <br/>
#include "common.h" <br/>
#include "GridStack.tab.h" <br/>
/*"GridStack.tab.h" */ <br/>
/* yylval, */ <br/>
/* bison */ <br/>
<br/>
<br/>
#undef ECHO <br/>
#define ECHO <br/>
% } <br/>
<br/>
digit [ 0 - 9 ] <br/>
<br/>
int_constant { digit } + <br/>
<br/>
% option noyywrap <--- yywrap <br/>
<br/>
%% <br/>
[ Mm ] [ Oo ] [ Nn ] [ Ii ] [ Tt ] [ Oo ] [ Rr ] { <br/>
yylval. IntVal = MONITOR;<br/>
return MONITOR;<br/>
} <br/>
[ Hh ] [ Ss ] [ Tt ] [ Aa ] [ Cc ] [ Kk ] { <br/>
yylval. IntVal = HSTACK;<br/>
return HSTACK;<br/>
} <br/>
[ Vv ] [ Ss ] [ Tt ] [ Aa ] [ Cc ] [ Kk ] { <br/>
yylval. IntVal = VSTACK;<br/>
return VSTACK;<br/>
} <br/>
[ Ww ] [ Ii ] [ Nn ] [ Dd ] [ Oo ] [ Ww ] { <br/>
yylval. IntVal = WINDOW;<br/>
return WINDOW;<br/>
} <br/>
{ int_constant } ! { <br/>
sscanf ( yytext , "%d!" ,& yylval. IntVal ) ;<br/>
return FIX_DIMENTION;<br/>
} <br/>
{ int_constant } { <br/>
sscanf ( yytext , "%d" ,& yylval. IntVal ) ;<br/>
return DIMENSION;<br/>
} <br/>
\ ( { <br/>
yylval. IntVal = OPEN;<br/>
return OPEN;<br/>
} <br/>
\ ) { <br/>
yylval. IntVal = CLOSE;<br/>
return CLOSE;<br/>
} <br/>
#.*$ /* */ <br/>
[ \n\r\t ] + /* */ <br/>
. { <br/>
return * yytext;<br/>
} <br/>
%% <br/>
<br/>
% {
#include <stdio.h>
#include <malloc.h>
#include "common.h"
% }
% union / * This is the definition of the yylval join type, which bison and flex * /
{ / * used to transfer the values of tokens. And bison for data transfer * /
int intVal; / * between the rules. Field names are types that can be assigned * /
TRegion * Region; / * tokens and nonterminals. * /
TListCage * RegionList; / * Below, the type of tokens is set with% token, and with% type - * /
TMonitor * Monitor; / * non-terminals. When used in rules of structures of the form $ 1, .., n and $$ * /
} / * the corresponding yylval fields are used. * /
% token < IntVal > MONITOR WINDOW HSTACK VSTACK OPEN CLOSE
% token < IntVal > DIMENSION FIX_DIMENTION
% type < Region > window hstack vstack region
% type < RegionList > region_list
% type < Monitor > monitor monitor_list
%%
start : monitor_list
{
Monitors = $ 1 ;
}
;
monitor_list : monitor
{
$$ = $ 1 ;
}
| monitor monitor_list
{
$ 1 -> Next = $ 2 ;
$$ = $ 1 ;
}
;
monitor : MONITOR DIMENSION region
{
TMonitor * Monitor = ( TMonitor * ) malloc ( sizeof ( TMonitor ) ) ;
Monitor -> Region = $ 3 ;
Monitor -> Monitor = $ 2 ;
Monitor -> Next = NULL ;
$$ = Monitor;
}
;
region_list : region
{
TListCage * Cage = ( TListCage * ) malloc ( sizeof ( TListCage ) ) ;
Cage -> Region = $ 1 ;
Cage -> Next = NULL ;
$$ = Cage;
}
| region region_list
{
TListCage * Cage = ( TListCage * ) malloc ( sizeof ( TListCage ) ) ;
Cage -> Region = $ 1 ;
Cage -> Next = $ 2 ;
$$ = Cage;
}
;
region : window
| hstack
| vstack
;
window : WINDOW DIMENSION
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtWindow;
Window -> isFixed = 0 ;
Window -> Dimension = $ 2 ;
Window -> RegionList = NULL ;
$$ = Window;
}
| WINDOW FIX_DIMENTION
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtWindow;
Window -> isFixed = 1 ;
Window -> Dimension = $ 2 ;
Window -> RegionList = NULL ;
$$ = Window;
}
| WINDOW
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtWindow;
Window -> isFixed = 0 ;
Window -> Dimension = 1 ;
Window -> RegionList = NULL ;
$$ = Window;
}
;
hstack : HSTACK OPEN region_list CLOSE
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtHorizontal;
Window -> isFixed = 0 ;
Window -> Dimension = 1 ;
Window -> RegionList = $ 3 ;
$$ = Window;
}
| HSTACK DIMENSION OPEN region_list CLOSE
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtHorizontal;
Window -> isFixed = 0 ;
Window -> Dimension = $ 2 ;
Window -> RegionList = $ 4 ;
$$ = Window;
}
| HSTACK FIX_DIMENTION OPEN region_list CLOSE
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtHorizontal;
Window -> isFixed = 1 ;
Window -> Dimension = $ 2 ;
Window -> RegionList = $ 4 ;
$$ = Window;
}
;
vstack : VSTACK OPEN region_list CLOSE
{
TRegion * Window = ( TRegion * ) malloc ( sizeof ( TRegion ) ) ;
Window -> RegionType = rtVertical;
Window -> isFixed = 0 ;
Window -> Dimension = 1 ;
Window <font color
Source: https://habr.com/ru/post/50509/
All Articles