pr_gramm.y
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:26k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. %{
  2. /*
  3.  * pr_gramm.y
  4.  *
  5.  * Resource compiler grammar
  6.  *
  7.  * Portable Windows Library
  8.  *
  9.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  10.  *
  11.  * The contents of this file are subject to the Mozilla Public License
  12.  * Version 1.0 (the "License"); you may not use this file except in
  13.  * compliance with the License. You may obtain a copy of the License at
  14.  * http://www.mozilla.org/MPL/
  15.  *
  16.  * Software distributed under the License is distributed on an "AS IS"
  17.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  18.  * the License for the specific language governing rights and limitations
  19.  * under the License.
  20.  *
  21.  * The Original Code is Portable Windows Library.
  22.  *
  23.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  24.  *
  25.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  26.  * All Rights Reserved.
  27.  *
  28.  * Contributor(s): ______________________________________.
  29.  *
  30.  * $Log: pr_gramm.y,v $
  31.  * Revision 1.26  1998/11/27 11:30:26  craigs
  32.  * Fixed problem with memory checking conflicting with bison defines
  33.  *
  34.  * Revision 1.26  1998/11/27 11:30:26  craigs
  35.  * Fixed problem with memory checking conflicting with bison defines
  36.  *
  37.  * Revision 1.25  1998/09/26 01:24:13  robertj
  38.  * Added open source license
  39.  *
  40.  * Revision 1.24  1998/09/26 00:39:37  robertj
  41.  * Fixed name space conflict with type Cursor.
  42.  *
  43.  * Revision 1.23  1998/09/14 13:47:26  robertj
  44.  * Allowed consecutive string literals to be used as single string in more syntactic places.
  45.  *
  46.  * Revision 1.22  1996/01/23 13:32:44  robertj
  47.  * More changes for editor
  48.  *
  49.  * Revision 1.21  1995/12/23 03:54:26  robertj
  50.  * Added extra structures for editor use.
  51.  *
  52.  * Revision 1.20  1995/12/10 12:12:03  robertj
  53.  * Changes to support graphical resource file editor.
  54.  *
  55.  * Revision 1.19  1995/10/14 15:19:12  robertj
  56.  * Fixed missing font size on font keyword.
  57.  * Changes required by move of standard buttons to PDialog.
  58.  *
  59.  * Revision 1.18  1995/08/24 12:48:05  robertj
  60.  * Added general control type for arbitrary dialog controls.
  61.  *
  62.  * Revision 1.17  1995/07/31 12:30:12  robertj
  63.  * Changed all generated resource IDs to be in the same "number space". This
  64.  *   is to avoid problems with IDs being used for more than one type of resource
  65.  *   eg a menu item and an image for a toolbar.
  66.  * Fixed the generated #line commands to include a relative path instead of an
  67.  *   absolute one.
  68.  *
  69.  * Revision 1.16  1995/04/02 09:28:15  robertj
  70.  * Added "balloon" help.
  71.  *
  72.  * Revision 1.15  1995/02/19 04:19:27  robertj
  73.  * Added dynamically linked command processing.
  74.  *
  75.  * Revision 1.14  1995/01/27  11:25:41  robertj
  76.  * Added pattern resource.
  77.  *
  78.  * Revision 1.13  1994/12/12  13:14:02  robertj
  79.  * Changed RealEdit to FloatEdit.
  80.  *
  81.  * Revision 1.12  1994/12/05  11:38:00  robertj
  82.  * Added #line to generated code.
  83.  *
  84.  * Revision 1.11  1994/07/02  03:30:08  robertj
  85.  * Restored header keyword accidentally deleted.
  86.  *
  87.  * Revision 1.9  1994/04/20  12:47:01  robertj
  88.  * *** empty log message ***
  89.  *
  90.  * Revision 1.8  1994/04/01  14:29:16  robertj
  91.  * New format PRC file
  92.  *
  93.  * Revision 1.7  1993/12/31  07:05:07  robertj
  94.  * Changed pixmap images for one pixel one number in PRC file.
  95.  *
  96.  * Revision 1.6  1993/12/01  16:12:09  robertj
  97.  * Windows NT port.
  98.  *
  99.  * Revision 1.5  1993/11/30  18:40:23  robertj
  100.  * Some formatting changes
  101.  *
  102.  * Revision 1.4  1993/08/20  21:31:56  robertj
  103.  * Fixed bug with freeing freed pointer.
  104.  * Optimised some code regarding converting char * to PString.
  105.  *
  106.  * Revision 1.3  1993/07/16  12:48:13  robertj
  107.  * Changed resource string dictionary to ResourceObject as consequence of
  108.  *    getting converted C literal strings.
  109.  * Removed redundant parameter from AddResource function.
  110.  *
  111.  * Revision 1.2  1993/07/15  04:38:31  robertj
  112.  * Rationalised lex.h, parse.h and main.h out of existance.
  113.  *
  114.  * Revision 1.1  1993/07/03  06:01:44  robertj
  115.  * Initial revision
  116.  *
  117.  * Revision 1.1  1993/06/24  19:23:17  craigs
  118.  * Initial revision
  119.  *
  120.  */
  121. #include <ptlib.h>
  122. #undef calloc
  123. #undef malloc
  124. #undef free
  125. #undef realloc
  126. #include "pwrc.h"
  127. // nasty globals used to store ptr to current control and layout
  128. ResourceFile    * current_file;
  129. ostream         * inline_src;
  130. ostream         * inline_hdr;
  131. static MenuBar  * current_menubar;
  132. static MenuItem * current_item;
  133. static Control  * current_control;
  134. static Layout   * current_layout;
  135. extern int yylex();
  136. /////////////////////////////////////////
  137. //
  138. //  yyerror
  139. //  required function for flex
  140. //
  141. void yyerror(char * str)
  142. {
  143.   extern char * yytext;
  144.   PError << StdError(Fatal) << str << " near token "" << yytext <<""n";
  145. }
  146. %}
  147. %token  MENU
  148. %token  ACCELERATORS
  149. %token  BEGIN_token
  150. %token  END
  151. %token  ITEM
  152. %token  SEPARATOR
  153. %token  ICON
  154. %token  CURSOR
  155. %token  PATTERN_token
  156. %token  IMAGE
  157. %token  STRING
  158. %token  MENUBAR
  159. %token  DIALOG
  160. %token  DIMENSIONS
  161. %token  POSITION
  162. %token  FONT
  163. %token  DEFPUSHBUTTON
  164. %token  PUSHBUTTON
  165. %token  CHECK3WAY
  166. %token  CHECKBOX
  167. %token  RADIOBUTTON
  168. %token  LEFTTEXT
  169. %token  CENTRETEXT
  170. %token  RIGHTTEXT
  171. %token  STATICBOX
  172. %token  EDITBOX
  173. %token  INTEDIT
  174. %token  FLOATEDIT
  175. %token  TEXTEDITOR
  176. %token  CHOICEBOX
  177. %token  LISTBOX
  178. %token  COMBOBOX
  179. %token  HSCROLLBAR
  180. %token  VSCROLLBAR
  181. %token  STATICICON
  182. %token  SORTED
  183. %token  MULTISELECT
  184. %token  MULTICOLUMN
  185. %token  HOTSPOT
  186. %token  ANDMASK
  187. %token  XORMASK
  188. %token  PIXELS
  189. %token  COLOURS
  190. %token  RESOURCE
  191. %token  CLASS
  192. %token  LAYOUT
  193. %token  MODALDIALOG
  194. %token  FIELD
  195. %token  VALUE
  196. %token  NOTIFY
  197. %token  TITLE
  198. %token  ID
  199. %token  OPTIONS
  200. %token  CANCEL
  201. %token  HELP
  202. %token  OK
  203. %token  DEFAULT
  204. %token  WINDOW
  205. %token  PASSWORDBOX
  206. %token  STRINGLIST
  207. %token  LIMITS
  208. %token  HEADER
  209. %token  CONTROL
  210. %token  HASH_DEFINE
  211. %token  END_DEFINE
  212. %token  <sval>  LITERAL
  213. %token  <sval>  IDENTIFIER
  214. %token  <ival>  INTEGER
  215. %token  '{'
  216. %token  '}'
  217. %token  ';'
  218. %token  '+'
  219. %token  '-'
  220. %token  '*'
  221. %token  '/'
  222. %token  '('
  223. %token  ')'
  224. %token  ','
  225. %type <ival>       expression option option_list
  226. %type <sval>       opt_resname literal_list title_decl field_decl
  227. %type <sval>       classsed_identifier
  228. %type <resid>      string_id menu_id item_id layout_id control_id
  229. %type <resid>      icon_id cursor_id pattern_id image_id data_id
  230. %type <menulist>   menu_decls
  231. %type <menu>       menu_decl
  232. %type <itemlist>   menu_items
  233. %type <item>       item_decl
  234. %type <separator>  separator_decl
  235. %type <pixels>     pix_block pixels
  236. %type <binary>     data_block data_items
  237. %type <strlist>    string_list string_list_block
  238. %type <pixcontent> icon_items cursor_items pattern_items image_items
  239. %type <defvalue>   define_expression
  240. %type <point>      pos_decl dim_decl
  241. %type <layout>     layout_base_class
  242. %type <control>    control_base_class
  243. %type <classes>    class_decl
  244. %union {
  245.   long                ival;
  246.   PString            *sval;
  247.   ResourceID         *resid;
  248.   MenuList           *menulist;
  249.   Menu               *menu;
  250.   MenuItemList       *itemlist;
  251.   MenuItem           *item;
  252.   Separator          *separator;
  253.   BinaryData         *binary;
  254.   PixData            *pixels;
  255.   PStringList        *strlist;
  256.   PixelContents      *pixcontent;
  257.   DefineValue        *defvalue;
  258.   Point              *point;
  259.   Control            *control;
  260.   Layout             *layout;
  261.   ClassedResource    *classes;
  262. }
  263. %left '+' '-'
  264. %left '*' '/'
  265. %left UMINUS
  266. %%
  267. file: /* empty */
  268.   | file resource
  269.   | file define
  270.   ;
  271. resource: menubar_resource
  272.     | string_resource
  273.     | icon_resource
  274.     | cursor_resource
  275.     | pattern_resource
  276.     | image_resource
  277.     | data_resource
  278.     | layout_resource
  279.     ;
  280. /***************************************************************************
  281.   Pre-processor rules
  282.  ***************************************************************************/
  283. define:   HASH_DEFINE IDENTIFIER define_expression END_DEFINE
  284.       { current_file->AddDefineIdentifier($2, $3); }
  285.     ;
  286. define_expression: /* empty */
  287.       { $$ = new DefineValue(1, FALSE); }
  288.     | expression
  289.       { $$ = new DefineValue($1, FALSE); }
  290.     | literal_list
  291.       {
  292.         $$ = new DefineValue(*$1);
  293.         delete $1;
  294.       }
  295.     ;
  296. expression: INTEGER
  297.       /* */
  298.     | IDENTIFIER
  299.       { $$ = current_file->GetIdentifierValue($1); }
  300.     | expression '+' expression
  301.       { $$ = $1 + $3; }
  302.     | expression '-' expression
  303.       { $$ = $1 - $3; }
  304.     | expression '/' expression
  305.       { $$ = $1 / $3; }
  306.     | expression '*' expression
  307.       { $$ = $1 * $3; }
  308.     | '(' expression ')'
  309.       { $$ = $2; }
  310.     | '-' expression              %prec UMINUS
  311.       { $$ = -($2); }
  312.     ;
  313. /***************************************************************************
  314.   String resources
  315.  ***************************************************************************/
  316. string_resource:  STRING opt_separator string_id opt_separator literal_list ';'
  317.       { current_file->AddResource(ResourceList::StringRes,
  318.                                        new StringResource($3, $5), "string"); }
  319.     ;
  320. string_id: expression
  321.       { $$ = new ResourceID($1); }
  322.     | '@' IDENTIFIER
  323.       { $$ = current_file->GetAutoIdentifier($2, current_file->stringDict); }
  324.     ;
  325. /***************************************************************************
  326.   Menu resources
  327.  ***************************************************************************/
  328. menubar_resource: MENUBAR menu_id block_begin
  329.       {
  330.         current_menubar = new MenuBar($2);
  331.         inline_src = &current_menubar->src_before;
  332.         inline_hdr = &current_menubar->hdr_before;
  333.       }
  334.     menubar_decls menu_decls
  335.       {
  336.         inline_src = &current_menubar->src_after;
  337.         inline_hdr = &current_menubar->hdr_after;
  338.         current_menubar->SetMenuList($6);
  339.       }
  340.     block_end
  341.       {
  342.         current_file->AddResource(ResourceList::MenubarRes,
  343.                                                    current_menubar, "menubar");
  344.         inline_src = &current_file->src_inline;
  345.         inline_hdr = &current_file->hdr_inline;
  346.       }
  347.     ;
  348. menu_id: /* empty */
  349.       { $$ = NULL; }
  350.     | expression
  351.       { $$ = new ResourceID($1); }
  352.     | '@' IDENTIFIER
  353.       { $$ = current_file->GetAutoIdentifier($2, current_file->menubarDict); }
  354.     ;
  355. menubar_decls: /* nothing */
  356.     | menubar_decls menubar_decl
  357.     ;
  358. menubar_decl: class_decl
  359.       {
  360.         current_menubar->SetResClass($1->GetResClass());
  361.         if ($1->GetAncestorClass().IsEmpty())
  362.           current_menubar->SetAncestorClass("PRootMenu");
  363.         else
  364.           current_menubar->SetAncestorClass($1->GetAncestorClass());
  365.         delete $1;
  366.       }
  367.     | WINDOW IDENTIFIER ';'
  368.       { current_menubar->SetWindow($2); }
  369.     | ID item_id ';'
  370.       { current_menubar->SetID($2); }
  371.     ;
  372. menu_decls: menu_decl
  373.       {
  374.         $$ = new MenuList();
  375.         $$->Append($1);
  376.       }
  377.     | menu_decls menu_decl
  378.       {
  379.         $1->Append($2);
  380.         $$ = $1;
  381.       }
  382.     ;
  383. menu_decl:  MENU literal_list block_begin menu_items block_end
  384.       { $$ = new Menu($2, $4); }
  385.     ;
  386. menu_items: /* empty */
  387.       { $$ = new MenuItemList (); }
  388.     | menu_items item_decl
  389.       { $1->Append($2); }
  390.     | menu_items menu_decl
  391.       { $1->Append($2); }
  392.     | menu_items separator_decl
  393.       { $1->Append($2); }
  394.     ;
  395. item_decl:  ITEM item_id block_begin 
  396.       {
  397.         current_item = new MenuItem($2);
  398.         inline_src = &current_item->src_before;
  399.         inline_hdr = &current_item->hdr_before;
  400.       }
  401.     item_body block_end
  402.       {
  403.         inline_src = &current_item->src_after;
  404.         inline_hdr = &current_item->hdr_after;
  405.         if (current_item->GetID() != -1)
  406.           current_menubar->itemDict.SetAt(current_item->GetID(), current_item);
  407.         $$ = current_item;
  408.       }
  409.     ;
  410. item_id: /* empty */
  411.       { $$ = NULL; }
  412.     | expression
  413.       { $$ = new ResourceID($1); }
  414.     | '@' IDENTIFIER
  415.       { $$ = current_file->GetAutoIdentifier($2, current_menubar->itemDict); }
  416.     ;
  417. item_body: item_attr
  418.     | item_body item_attr
  419.     ;
  420. item_attr:  title_decl
  421.       { current_item->SetText($1); }
  422.     | field_decl
  423.       { current_item->SetFieldName($1); }
  424.     | NOTIFY classsed_identifier ';'
  425.       { current_item->SetNotify($2); }
  426.     | NOTIFY LITERAL ';'
  427.       { current_item->SetNotify($2); }
  428.     | ID item_id ';'
  429.       {
  430.         if (current_menubar->itemDict.GetAt($2->GetNum()) != NULL)
  431.           PError << StdError(Fatal)
  432.                  << "cannot use menu item identifier more than once.n";
  433.         current_item->SetID($2);
  434.       }
  435.     | ACCELERATORS literal_list ';'
  436.       {
  437.         PStringList * list = new PStringList();
  438.         list->Append($2);
  439.         current_item->SetAccelerators(list);
  440.       }
  441.     | ACCELERATORS string_list_block
  442.       { current_item->SetAccelerators($2); }
  443.     ;
  444. separator_decl: SEPARATOR ';'
  445.       { $$ = new Separator(); }
  446.     ;
  447. /***************************************************************************
  448.   layout/dialog/modaldialog resource
  449.  ***************************************************************************/
  450. layout_resource:  layout_base_class layout_id block_begin
  451.       {
  452.         current_layout = $1;
  453.         current_layout->SetID($2);
  454.         inline_src = &current_layout->src_before;
  455.         inline_hdr = &current_layout->hdr_before;
  456.       }
  457.     layout_decls control_decls
  458.       {
  459.         inline_src = &current_layout->src_after;
  460.         inline_hdr = &current_layout->hdr_after;
  461.         current_layout->SetUniqueItemIDs();
  462.       }
  463.     block_end
  464.       {
  465.         current_file->AddResource(ResourceList::LayoutRes,
  466.                                                      current_layout, "dialog");
  467.         inline_src = &current_file->src_inline;
  468.         inline_hdr = &current_file->hdr_inline;
  469.       }
  470.     ;
  471. layout_id:    /* empty */
  472.       { $$ = NULL; }
  473.     | expression
  474.       { $$ = new ResourceID($1); }
  475.     | '@' IDENTIFIER
  476.       { $$ = current_file->GetAutoIdentifier($2, current_file->dialogDict); }
  477.     ;
  478. layout_base_class:
  479.     LAYOUT
  480.       { $$ = new Layout("PInteractorLayout", 0); }
  481.     | DIALOG
  482.       { $$ = new Layout("PDialog", 1); }
  483.     | MODALDIALOG
  484.       { $$ = new Layout("PModalDialog", 2); }
  485.     ;
  486. layout_decls: layout_decl
  487.     | layout_decls layout_decl
  488.     ;
  489. layout_decl:  ID layout_id ';'
  490.       { current_layout->SetID($2); }
  491.     | pos_decl
  492.       { current_layout->SetPos($1); }
  493.     | dim_decl
  494.       { current_layout->SetDim($1); }
  495.     | title_decl
  496.       { current_layout->SetText($1); }
  497.     | class_decl
  498.       {
  499.         current_layout->SetResClass($1->GetResClass());
  500.         if (!$1->GetAncestorClass().IsEmpty())
  501.           current_layout->SetAncestorClass($1->GetAncestorClass());
  502.         delete $1;
  503.       }
  504.     | FONT literal_list opt_separator expression ';'
  505.       { current_layout->SetFontInfo($2, $4); }
  506.     | HEADER literal_list ';'
  507.       { current_layout->SetHeader($2); }
  508.     ;
  509. control_decls:  control_decl
  510.     | control_decls control_decl
  511.     ;
  512. control_decl: control_base_class control_id block_begin
  513.       {
  514.         current_control = $1;
  515.         current_control->SetID($2);
  516.         inline_src = &current_control->src_before;
  517.         inline_hdr = &current_control->hdr_before;
  518.       }
  519.     opt_control_attr_decls block_end
  520.       {
  521.         current_layout->AddControl(current_control);
  522.         inline_src = &current_control->src_after;
  523.         inline_hdr = &current_control->hdr_after;
  524.       }
  525.     ;
  526. control_id:    /* empty */
  527.       { $$ = NULL; }
  528.     | expression
  529.       { $$ = new ResourceID($1); }
  530.     | '@' IDENTIFIER
  531.       { $$ = current_file->GetAutoIdentifier($2, current_layout->itemDict); }
  532.     ;
  533. control_base_class: PUSHBUTTON
  534.       { $$ = new PushButton(); }
  535.     | CHECK3WAY
  536.       { $$ = new Check3Way(); }
  537.     | CHECKBOX
  538.       { $$ = new CheckBox(); }
  539.     | RADIOBUTTON
  540.       { $$ = new RadioButton(); }
  541.     | LEFTTEXT
  542.       { $$ = new LeftText(); }
  543.     | CENTRETEXT
  544.       { $$ = new CentreText(); }
  545.     | RIGHTTEXT
  546.       { $$ = new RightText(); }
  547.     | STATICBOX
  548.       { $$ = new StaticBox(); }
  549.     | EDITBOX
  550.       { $$ = new EditBox(); }
  551.     | INTEDIT
  552.       { $$ = new IntEditBox(); }
  553.     | FLOATEDIT
  554.       { $$ = new FloatEditBox(); }
  555.     | TEXTEDITOR
  556.       { $$ = new TextEditor(); }
  557.     | PASSWORDBOX
  558.       { $$ = new Password(); }
  559.     | CHOICEBOX
  560.       { $$ = new ChoiceBox(); }
  561.     | LISTBOX
  562.       { $$ = new ListBox(); }
  563.     | COMBOBOX
  564.       { $$ = new ComboBox(); }
  565.     | HSCROLLBAR
  566.       { $$ = new HScrollBar(); }
  567.     | VSCROLLBAR
  568.       { $$ = new VScrollBar(); }
  569.     | STATICICON
  570.       { $$ = new StaticIcon(); }
  571.     | CONTROL
  572.       { $$ = new UserControl(); }
  573.     ;
  574. opt_control_attr_decls: /* empty */
  575.     | opt_control_attr_decls control_attr_decl
  576.     ;
  577. control_attr_decl:  ID control_id ';' 
  578.       { current_control->SetID($2); }
  579.     | pos_decl
  580.       { current_control->SetPos($1); }
  581.     | dim_decl
  582.       { current_control->SetDim($1); }
  583.     | title_decl
  584.       { current_control->SetText($1); }
  585.     | class_decl
  586.       {
  587.         current_control->SetResClass($1->GetResClass());
  588.         if (!$1->GetAncestorClass().IsEmpty())
  589.           PError << StdError(Warning)
  590.                  << "cannot specify ancestor class on control.n";
  591.         delete $1;
  592.       }
  593.     | field_decl
  594.       { current_control->SetFieldName($1); }
  595.     | NOTIFY classsed_identifier ';'
  596.       { current_control->SetNotify($2); }
  597.     | NOTIFY LITERAL
  598.       { current_control->SetNotify($2); }
  599.     | VALUE classsed_identifier ';'
  600.       { current_control->SetValueName($2, new PString()); }
  601.     | VALUE IDENTIFIER '=' literal_list ';'
  602.       { current_control->SetValueName($2, $4); }
  603.     | VALUE IDENTIFIER '=' expression ';'
  604.       { current_control->SetValueName($2, new PString(psprintf("%li", $4))); }
  605.     | ICON expression ';'
  606.       { current_control->SetIcon($2); }
  607.     | HELP literal_list ';'
  608.       { current_control->SetHelp($2); }
  609.     | OPTIONS option_list ';'
  610.       { current_control->SetOptions($2); }
  611.     | LIMITS expression ',' expression ',' expression ',' expression ';'
  612.       { current_control->SetLimits($2, $4, $6, $8); }
  613.     | STRINGLIST string_list_block
  614.       { current_control->SetStringList($2); }
  615.     ;
  616. option_list:  option
  617.       { $$ = $1 }
  618.     | option_list option
  619.       { $$ = $1 | $2; }
  620.     | option_list ',' option
  621.       { $$ = $1 | $3; }
  622.     ;
  623. option:   SORTED
  624.       { $$ = SortedOption; }
  625.     | MULTISELECT
  626.       { $$ = MultiSelectOption;  }
  627.     | MULTICOLUMN
  628.       { $$ = MultiColumnOption; }
  629.     | DEFAULT
  630.       { $$ = DefaultButtonOption; }
  631.     | OK
  632.       { $$ = OkButtonOption; }
  633.     | CANCEL
  634.       { $$ = CancelButtonOption; }
  635.     | HELP
  636.       { $$ = HelpButtonOption; }
  637.     ;
  638. pos_decl: POSITION expression ',' expression ';'
  639.       { $$ = new Point ($2, $4); }
  640.     ;
  641. dim_decl: DIMENSIONS expression ',' expression ';'
  642.       { $$ = new Point ($2, $4); }
  643.     ;
  644. title_decl: TITLE literal_list ';'
  645.       { $$ = $2; }
  646.     ;
  647. class_decl: CLASS IDENTIFIER ';'
  648.       { $$ = new ClassedResource($2); }
  649.     | CLASS IDENTIFIER ':' IDENTIFIER ';'
  650.       { $$ = new ClassedResource($2, $4); }
  651.     ;
  652. field_decl: FIELD classsed_identifier ';'
  653.       { $$ = $2; }
  654.     ;
  655. classsed_identifier: IDENTIFIER
  656.       { $$ = $1; }
  657.     | ':' ':' IDENTIFIER
  658.       { $$ = new PString("::" + *$3); delete $3; }
  659.     | IDENTIFIER ':' ':' IDENTIFIER
  660.       { $$ = new PString(*$1 + "::" + *$4); delete $1; delete $4; }
  661.     ;
  662. /***************************************************************************
  663.   Icon resources
  664.  ***************************************************************************/
  665. icon_resource:  ICON opt_separator icon_id block_begin icon_items block_end
  666.       { current_file->AddResource(ResourceList::IconRes,
  667.                                                   new Icon ($3, $5), "icon"); }
  668.     ;
  669. icon_id: expression
  670.       { $$ = new ResourceID($1); }
  671.     | '@' IDENTIFIER
  672.       { $$ = current_file->GetAutoIdentifier($2, current_file->iconDict); }
  673.     ;
  674. icon_items: /* empty */
  675.       { $$ = new PixelContents(); }
  676.     | icon_items DIMENSIONS
  677.                      opt_separator expression ',' expression ',' expression ';'
  678.       { $$->SetDimensions($4, $6, $8); }
  679.     | icon_items COLOURS data_block
  680.       { $$->SetClut($3); }
  681.     | icon_items ANDMASK pix_block
  682.       { $$->SetAndMask($3); }
  683.     | icon_items XORMASK pix_block
  684.       { $$->SetXorMask($3); }
  685.     | icon_items PIXELS pix_block
  686.       { $$->SetPixels($3); }
  687.     ;
  688. /***************************************************************************
  689.   Cursor resources
  690.  ***************************************************************************/
  691. cursor_resource:  CURSOR
  692.                     opt_separator cursor_id block_begin cursor_items block_end
  693.       { current_file->AddResource(ResourceList::CursorRes,
  694.                                                new CursorResource($3, $5), "cursor"); }
  695.     ;
  696. cursor_id: expression
  697.       { $$ = new ResourceID($1); }
  698.     | '@' IDENTIFIER
  699.       { $$ = current_file->GetAutoIdentifier($2, current_file->cursorDict); }
  700.     ;
  701. cursor_items: /* empty */
  702.       { $$ = new PixelContents(); }
  703.     | cursor_items DIMENSIONS
  704.                      opt_separator expression ',' expression ',' expression ';'
  705.       { $$->SetDimensions($4, $6, $8); }
  706.     | cursor_items HOTSPOT opt_separator expression ',' expression ';'
  707.       { $$->SetHotSpot($4, $6); }
  708.     | cursor_items COLOURS data_block
  709.       { $$->SetClut($3); }
  710.     | cursor_items ANDMASK pix_block
  711.       { $$->SetAndMask($3); }
  712.     | cursor_items XORMASK pix_block
  713.       { $$->SetXorMask($3); }
  714.     | cursor_items PIXELS pix_block
  715.       { $$->SetPixels($3); }
  716.     ;
  717. /***************************************************************************
  718.   Pattern resources
  719.  ***************************************************************************/
  720. pattern_resource:  PATTERN_token
  721.                   opt_separator pattern_id block_begin pattern_items block_end
  722.       { current_file->AddResource(ResourceList::PatternRes,
  723.                                             new Pattern($3, $5), "pattern"); }
  724.     ;
  725. pattern_id: expression
  726.       { $$ = new ResourceID($1); }
  727.     | '@' IDENTIFIER
  728.       { $$ = current_file->GetAutoIdentifier($2, current_file->patternDict); }
  729.     ;
  730. pattern_items: /* empty */
  731.       { $$ = new PixelContents(); }
  732.     | pattern_items DIMENSIONS
  733.                      opt_separator expression ',' expression ',' expression ';'
  734.       { $$->SetDimensions($4, $6, $8); }
  735.     | pattern_items COLOURS data_block
  736.       { $$->SetClut($3); }
  737.     | pattern_items PIXELS pix_block
  738.       { $$->SetPixels($3); }
  739.     ;
  740. /***************************************************************************
  741.   Image resources
  742.  ***************************************************************************/
  743. image_resource:  IMAGE opt_separator image_id block_begin image_items block_end
  744.       { current_file->AddResource(ResourceList::ImageRes,
  745.                                                  new Image($3, $5), "image"); }
  746.     ;
  747. image_id: expression
  748.       { $$ = new ResourceID($1); }
  749.     | '@' IDENTIFIER
  750.       { $$ = current_file->GetAutoIdentifier($2, current_file->imageDict); }
  751.     ;
  752. image_items: /* empty */
  753.       { $$ = new PixelContents(); }
  754.     | image_items DIMENSIONS
  755.                      opt_separator expression ',' expression ',' expression ';'
  756.       { $$->SetDimensions($4, $6, $8); }
  757.     | image_items COLOURS data_block
  758.       { $$->SetClut($3); }
  759.     | image_items PIXELS pix_block
  760.       { $$->SetPixels($3); }
  761.     ;
  762. /***************************************************************************
  763.   Data resources
  764.  ***************************************************************************/
  765. data_resource:  RESOURCE opt_separator data_id opt_resname data_block
  766.       { current_file->AddResource(ResourceList::DataRes,
  767.                               new DataResource($3, $4, $5), "data resource"); }
  768.     ;
  769. data_id: expression
  770.       { $$ = new ResourceID($1); }
  771.     | '@' IDENTIFIER
  772.       { $$ = current_file->GetAutoIdentifier($2, current_file->dataDict); }
  773.     ;
  774. opt_resname: /* empty */
  775.       { $$ = NULL; }
  776.     | literal_list
  777.       { $$ = $1; }
  778.     | ',' literal_list
  779.       { $$ = $2; }
  780.     ;
  781. /***************************************************************************
  782.   Misc rules
  783.  ***************************************************************************/
  784. block_begin:  BEGIN_token
  785.     | '{'
  786.     ;
  787. block_end:  END
  788.     | '}'
  789.     ;
  790. pix_block: block_begin pixels block_end
  791.       { $$ = $2; }
  792.     ;
  793. pixels: /* empty */
  794.       { $$ = new PixData(); }
  795.     | pixels INTEGER
  796.       {
  797.         if ($2 < 0)
  798.           PError << StdError(Warning) << "negative value in pixel datan";
  799.         if ($2 > 255)
  800.           PError << StdError(Warning) << "pix data greater than 255n";
  801.         $1->Append ((BYTE)$2);
  802.       }
  803.     | pixels ','
  804.     ;
  805. data_block: block_begin data_items block_end
  806.       { $$ = $2; }
  807.     ;
  808. data_items: /* empty */
  809.       { $$ = new BinaryData(); }
  810.     | data_items INTEGER
  811.       {
  812.         if ($2 < 0)
  813.           PError << StdError(Warning) << "negative value in binary datan";
  814.         $1->Append ((BYTE)($2 & 0xff));
  815.         if ($2 > 255)
  816.           $1->Append ((BYTE)(($2 >> 8) & 0xff));
  817.       }
  818.     | data_items LITERAL
  819.       {
  820.         PString s(PString::Literal, *$2);
  821.         delete $2;
  822.         for (PINDEX i = 0; i < s.GetLength(); i++)
  823.           $1->Append (s[i]);
  824.       }
  825.     | data_items ','
  826.     ;
  827. string_list_block:  block_begin string_list block_end
  828.       { $$ = $2; }
  829.     ;
  830. string_list: literal_list
  831.       {
  832.         $$ = new PStringList();
  833.         $$->Append ($1);
  834.       }
  835.     | string_list ',' literal_list
  836.       { $1->Append ($3); }
  837.     ;
  838. literal_list: LITERAL
  839.       { $$ = $1; }
  840.     | literal_list LITERAL
  841.       {
  842.         *$1 = $1->Left($1->GetLength()-1) + $2->Right($2->GetLength()-1);
  843.         delete $2;
  844.         $$ = $1;
  845.       }
  846.     ;
  847. opt_separator: /* empty */
  848.     | ','
  849.     ;