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

IP电话/视频会议

开发平台:

Visual C++

  1. %{
  2. /*
  3.  * pr_lex.l
  4.  *
  5.  * Resource compiler lexical analyser
  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_lex.l,v $
  31.  * Revision 1.24  1999/10/29 11:44:25  robertj
  32.  * Fixed #ifdef conditional around the wrong way.
  33.  *
  34.  * Revision 1.24  1999/10/29 11:44:25  robertj
  35.  * Fixed #ifdef conditional around the wrong way.
  36.  *
  37.  * Revision 1.23  1999/10/19 07:08:23  robertj
  38.  * Added #ifdef/#ifndef condition compile functionality
  39.  *
  40.  * Revision 1.22  1999/02/06 08:45:33  robertj
  41.  * egcs compatibility
  42.  *
  43.  * Revision 1.21  1998/09/26 01:24:15  robertj
  44.  * Added open source license
  45.  *
  46.  * Revision 1.20  1998/09/26 00:40:27  robertj
  47.  * Fixed linkage mismatch of lex function.
  48.  *
  49.  * Revision 1.19  1998/09/14 13:48:05  robertj
  50.  * Allowed suppression of some warnings.
  51.  *
  52.  * Revision 1.18  1997/12/12 08:44:25  robertj
  53.  * Update to currect version of PWLIB
  54.  *
  55.  * Revision 1.17  1996/01/23 13:32:45  robertj
  56.  * More changes for editor
  57.  *
  58.  * Revision 1.16  1995/12/23 03:53:39  robertj
  59.  * Added extra collections for editor use.
  60.  *
  61.  * Revision 1.15  1995/12/10 12:12:05  robertj
  62.  * Changes to support graphical resource file editor.
  63.  *
  64.  * Revision 1.14  1995/08/24 12:48:13  robertj
  65.  * Added general control type for arbitrary dialog controls.
  66.  *
  67.  * Revision 1.13  1995/07/31 12:30:13  robertj
  68.  * Changed all generated resource IDs to be in the same "number space". This
  69.  *   is to avoid problems with IDs being used for more than one type of resource
  70.  *   eg a menu item and an image for a toolbar.
  71.  * Fixed the generated #line commands to include a relative path instead of an
  72.  *   absolute one.
  73.  *
  74.  * Revision 1.12  1995/01/27 11:25:43  robertj
  75.  * Added pattern resource.
  76.  *
  77.  * Revision 1.11  1994/12/12  13:14:04  robertj
  78.  * Changed RealEdit to FloatEdit.
  79.  *
  80.  * Revision 1.10  1994/12/05  11:38:01  robertj
  81.  * Added #line to generated code.
  82.  *
  83.  * Revision 1.9  1994/10/23  06:07:12  robertj
  84.  * Shortened OS error assert.
  85.  *
  86.  * Revision 1.8  1994/07/02  03:28:52  robertj
  87.  * Fixed accidentaly removed header keyword.
  88.  * Fixed comment parsing problem.
  89.  *
  90.  * Revision 1.6  1994/04/20  12:47:01  robertj
  91.  * *** empty log message ***
  92.  *
  93.  * Revision 1.5  1994/04/01  14:29:16  robertj
  94.  * New format PRC file
  95.  *
  96.  * Revision 1.4  1993/08/20  21:31:56  robertj
  97.  * Included ctype for unix compatibility.
  98.  *
  99.  * Revision 1.3  1993/07/16  12:48:13  robertj
  100.  * Added slash star style comments.
  101.  * General formatting.
  102.  *
  103.  * Revision 1.2  1993/07/15  04:38:31  robertj
  104.  * Rationalised lex.h, parse.h and main.h out of existance.
  105.  * Fixed literal string so can have embedded " characters.
  106.  *
  107.  * Revision 1.1  1993/07/03  06:01:44  robertj
  108.  * Initial revision
  109.  *
  110.  * Revision 1.2  1993/06/24  19:48:57  craigs
  111.  * Added support for hash comments
  112.  *
  113.  * Revision 1.1  1993/06/24  19:23:17  craigs
  114.  * Initial revision
  115.  *
  116.  */
  117. #include <ptlib.h>
  118. #include "pwrc.h"
  119. #include "pr_gramm.h"
  120. #include <ctype.h>
  121. extern FILE * yyin;
  122. extern int yyparse();
  123. extern ResourceFile * current_file;
  124. extern ostream * inline_src;
  125. extern ostream * inline_hdr;
  126. ///////////////////////////////////////////
  127. //
  128. //  handling for "include" files
  129. //
  130. PDECLARE_CLASS(LexState, PObject)
  131.   public:
  132.     LexState(const PFilePath & fn)
  133.       : filename(fn) { line_number = 1; }
  134.     Comparison Compare(const PObject & obj) const
  135.       { return filename.Compare(((const LexState &)obj).filename); }
  136.     YY_BUFFER_STATE yy_state;
  137.     unsigned        line_number;
  138.     PFilePath       filename;
  139.     PDirectory      dir;
  140. };
  141. PSTACK(LexStack, LexState);
  142. static LexStack LexFile;
  143. static int in_define;
  144. static int in_multiline_comment;
  145. PStringArray IncludePath;
  146. ResourceFile::ResourceFile(PFile & prcfile, BOOL suppress,
  147.    const PString & predefinedSymbols)
  148. {
  149.   nextResourceId  = 10000;
  150.   fatals = warnings = 0;
  151.   suppressInfoWarnings = suppress;
  152.   PStringArray symbols = predefinedSymbols.Lines();
  153.   for (PINDEX i = 0; i < symbols.GetSize(); i++)
  154.     defineDict.SetAt(symbols[i], new DefineValue(1, FALSE));
  155.   inline_src = &src_inline;
  156.   inline_hdr = &hdr_inline;
  157.   for (PINDEX type = 0; type < ResourceList::NumResTypes; type++) {
  158.     resources[type].type = (ResourceList::ResTypes)type;
  159.     resources[type].DisallowDeleteObjects();
  160.   }
  161.   resourceDict[ResourceList::StringRes] = &stringDict;
  162.   resourceDict[ResourceList::MenubarRes] = &menubarDict;
  163.   resourceDict[ResourceList::LayoutRes] = &dialogDict;
  164.   resourceDict[ResourceList::IconRes] = &iconDict;
  165.   resourceDict[ResourceList::CursorRes] = &cursorDict;
  166.   resourceDict[ResourceList::PatternRes] = &patternDict;
  167.   resourceDict[ResourceList::ImageRes] = &imageDict;
  168.   resourceDict[ResourceList::DataRes] = &dataDict;
  169.   current_file = this;
  170.   in_define = 0;
  171.   LexFile.Push(new LexState(prcfile.GetFilePath()));
  172.   yyin = _fdopen(prcfile.GetHandle(), "r");
  173.   PAssertNULL(yyin);
  174.   yyparse();
  175. }
  176. ostream & operator<<(ostream & out, const StdError & e)
  177. {
  178.   if (e.e == Info && current_file->suppressInfoWarnings) {
  179.     static PStringStream dummy;
  180.     dummy = "";
  181.     return dummy;
  182.   }
  183.   out << e.l.filename << '(' << e.l.number << ") : ";
  184.   if (e.e == Fatal) {
  185.     current_file->fatals++;
  186.     out << "error";
  187.   }
  188.   else {
  189.     current_file->warnings++;
  190.     out << "warning";
  191.   }
  192.   return out << ": ";
  193. }
  194. void LineNumber::Set()
  195. {
  196.   if (LexFile.IsEmpty()) {
  197.     filename = "";
  198.     number = 0;
  199.   }
  200.   else {
  201.     filename = LexFile.Top().filename;
  202.     number = LexFile.Top().line_number;
  203.   }
  204. }
  205. extern "C" int yywrap()
  206. {
  207.   return 1;
  208. }
  209. %}
  210. %x hash_include hash_inline_src hash_inline_hdr comment_lines conditional_compilation
  211. %%
  212. [Dd][Ee][Ff][Pp][Uu][Ss][Hh][Bb][Uu][Tt][Tt][Oo][Nn]  { return DEFPUSHBUTTON; }
  213. [Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Oo][Rr][Ss]  { return ACCELERATORS; }
  214. [Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd][Bb][Oo][Xx]  { return PASSWORDBOX; }
  215. [Mm][Oo][Dd][Aa][Ll][Dd][Ii][Aa][Ll][Oo][Gg]  { return MODALDIALOG; }
  216. [Rr][Aa][Dd][Ii][Oo][Bb][Uu][Tt][Tt][Oo][Nn]  { return RADIOBUTTON; }
  217. [Mm][Uu][Ll][Tt][Ii][Ss][Ee][Ll][Ee][Cc][Tt]  { return MULTISELECT; }
  218. [Mm][Uu][Ll][Tt][Ii][Cc][Oo][Ll][Uu][Mm][Nn]  { return MULTICOLUMN; }
  219. [Ss][Tt][Rr][Ii][Nn][Gg][Ll][Ii][Ss][Tt]  { return STRINGLIST; }
  220. [Pp][Uu][Ss][Hh][Bb][Uu][Tt][Tt][Oo][Nn]  { return PUSHBUTTON; }
  221. [Ss][Tt][Aa][Tt][Ii][Cc][Ii][Cc][Oo][Nn]  { return STATICICON; }
  222. [Cc][Ee][Nn][Tt][Rr][Ee][Tt][Ee][Xx][Tt]  { return CENTRETEXT; }
  223. [Cc][Ee][Nn][Tt][Ee][Rr][Tt][Ee][Xx][Tt]  { return CENTRETEXT; }
  224. [Hh][Ss][Cc][Rr][Oo][Ll][Ll][Bb][Aa][Rr]  { return HSCROLLBAR; }
  225. [Vv][Ss][Cc][Rr][Oo][Ll][Ll][Bb][Aa][Rr]  { return VSCROLLBAR; }
  226. [Tt][Ee][Xx][Tt][Ee][Dd][Ii][Tt][Oo][Rr]  { return TEXTEDITOR; }
  227. [Dd][Ii][Mm][Ee][Nn][Ss][Ii][Oo][Nn][Ss]  { return DIMENSIONS; }
  228. [Dd][Ii][Mm]                              { return DIMENSIONS; }
  229. [Rr][Ii][Gg][Hh][Tt][Tt][Ee][Xx][Tt]  { return RIGHTTEXT; }
  230. [Ss][Tt][Aa][Tt][Ii][Cc][Bb][Oo][Xx]  { return STATICBOX; }
  231. [Ss][Ee][Pp][Aa][Rr][Aa][Tt][Oo][Rr]  { return SEPARATOR; }
  232. [Cc][Hh][Oo][Ii][Cc][Ee][Bb][Oo][Xx]  { return CHOICEBOX; }
  233. [Ff][Ll][Oo][Aa][Tt][Ee][Dd][Ii][Tt]  { return FLOATEDIT; }
  234. [Cc][Hh][Ee][Cc][Kk]3[Ww][Aa][Yy]  { return CHECK3WAY; }
  235. [Cc][Hh][Ee][Cc][Kk][Bb][Oo][Xx]  { return CHECKBOX; }
  236. [Ll][Ee][Ff][Tt][Tt][Ee][Xx][Tt]  { return LEFTTEXT; }
  237. [Pp][Oo][Ss][Ii][Tt][Ii][Oo][Nn]  { return POSITION; }
  238. [Pp][Oo][Ss]                      { return POSITION; }
  239. [Cc][Oo][Mm][Bb][Oo][Bb][Oo][Xx]  { return COMBOBOX; }
  240. [Rr][Ee][Ss][Oo][Uu][Rr][Cc][Ee]  { return RESOURCE; }
  241. [Oo][Pp][Tt][Ii][Oo][Nn][Ss]  { return OPTIONS; }
  242. [Ee][Dd][Ii][Tt][Bb][Oo][Xx]  { return EDITBOX; }
  243. [Ii][Nn][Tt][Ee][Dd][Ii][Tt]  { return INTEDIT; }
  244. [Ll][Ii][Ss][Tt][Bb][Oo][Xx]  { return LISTBOX; }
  245. [Mm][Ee][Nn][Uu][Bb][Aa][Rr]  { return MENUBAR; }
  246. [Pp][Aa][Tt][Tt][Ee][Rr][Nn]  { return PATTERN_token; }
  247. [Hh][Oo][Tt][Ss][Pp][Oo][Tt]  { return HOTSPOT; }
  248. [Aa][Nn][Dd][Mm][Aa][Ss][Kk]  { return ANDMASK; }
  249. [Xx][Oo][Rr][Mm][Aa][Ss][Kk]  { return XORMASK; }
  250. [Cc][Oo][Ll][Oo][Uu][Rr][Ss]  { return COLOURS; }
  251. [Cc][Oo][Ll][Oo][Rr][Ss]      { return COLOURS; }
  252. [Dd][Ee][Ff][Aa][Uu][Ll][Tt]  { return DEFAULT; }
  253. [Cc][Oo][Nn][Tt][Rr][Oo][Ll]  { return CONTROL; }
  254. [Hh][Ee][Aa][Dd][Ee][Rr]  { return HEADER; }
  255. [Ww][Ii][Nn][Dd][Oo][Ww]  { return WINDOW; }
  256. [Nn][Oo][Tt][Ii][Ff][Yy]  { return NOTIFY; }
  257. [Ll][Aa][Yy][Oo][Uu][Tt]  { return LAYOUT; }
  258. [Ss][Tt][Rr][Ii][Nn][Gg]  { return STRING; }
  259. [Dd][Ii][Aa][Ll][Oo][Gg]  { return DIALOG; }
  260. [Ss][Oo][Rr][Tt][Ee][Dd]  { return SORTED; }
  261. [Cc][Uu][Rr][Ss][Oo][Rr]  { return CURSOR; }
  262. [Pp][Ii][Xx][Ee][Ll][Ss]  { return PIXELS; }
  263. [Cc][Aa][Nn][Cc][Ee][Ll]  { return CANCEL; }
  264. [Ll][Ii][Mm][Ii][Tt][Ss]  { return LIMITS; }
  265. [Tt][Ii][Tt][Ll][Ee]  { return TITLE; }
  266. [Ii][Mm][Aa][Gg][Ee]  { return IMAGE; }
  267. [Bb][Ee][Gg][Ii][Nn]  { return BEGIN_token; }
  268. [Vv][Aa][Ll][Uu][Ee]  { return VALUE; }
  269. [Cc][Ll][Aa][Ss][Ss]  { return CLASS; }
  270. [Ff][Ii][Ee][Ll][Dd]  { return FIELD; }
  271. [Ff][Oo][Nn][Tt]  { return FONT; }
  272. [Mm][Ee][Nn][Uu]  { return MENU; }
  273. [Ii][Cc][Oo][Nn]  { return ICON; }
  274. [Ii][Tt][Ee][Mm]  { return ITEM; }
  275. [Hh][Ee][Ll][Pp]  { return HELP; }
  276. [Ee][Nn][Dd]  { return END; }
  277. [Ii][Dd]      { return ID; }
  278. [Oo][Kk]      { return OK; }
  279. ^"#inline"[ t]+"src".*  {
  280.     BEGIN(hash_inline_src);
  281.     *inline_src << LineNumber();
  282.   }
  283. <hash_inline_src>^"#inline"[ t]+"end".*  { BEGIN(0); }
  284. <hash_inline_src>^[^n]*  { *inline_src << yytext; }
  285. <hash_inline_src>n  {
  286.     LexFile.Top().line_number++;
  287.     *inline_src << 'n';
  288.   }
  289. ^"#inline"[ t]+"hdr".*  {
  290.     BEGIN(hash_inline_hdr);
  291.     *inline_hdr << LineNumber();
  292.   }
  293. <hash_inline_hdr>^"#inline"[ t]+"end".*  { BEGIN(0); }
  294. <hash_inline_hdr>^[^n]*  { *inline_hdr << yytext; }
  295. <hash_inline_hdr>n  {
  296.     LexFile.Top().line_number++;
  297.     *inline_hdr << 'n'; 
  298.   }
  299. ^#include  { BEGIN(hash_include); }
  300. <hash_include>[ t]  { }
  301. <hash_include>[^ tn]*  {
  302.     PString text(yytext);
  303.     PINDEX end = P_MAX_INDEX;
  304.     PINDEX start = text.FindOneOf(""<");
  305.     if (start != P_MAX_INDEX)
  306.       end = text.Find(text[start] == '"' ? '"' : '>', start+1);
  307.     if (start == P_MAX_INDEX || end == P_MAX_INDEX)
  308.       PError << StdError(Warning) << "badly formed include.n";
  309.     else {
  310.       PString fname = text(start+1, end-1);
  311.       FILE * file = NULL;
  312.       if (text[start] == '"')
  313.         file = fopen(fname, "r");
  314.       for (PINDEX i = 0; file == NULL && i < IncludePath.GetSize(); i++) {
  315.         if (PDirectory::Change(IncludePath[i]))
  316.           file = fopen(fname, "r");
  317.         else
  318.           PError << StdError(Warning) << "invalid path ""
  319.                  << IncludePath[i] << "".n";
  320.         if (file == NULL)
  321.           PAssertOS(LexFile.Top().dir.Change());
  322.       }
  323.       if (file == NULL)
  324.         PError << StdError(Warning)
  325.                << "include file " << fname << " not found.n";
  326.       else {
  327.         LexFile.Top().yy_state = YY_CURRENT_BUFFER;
  328.         LexFile.Push(new LexState(fname));
  329.         yyin = file;
  330.         yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
  331.       }
  332.     }
  333.     BEGIN(INITIAL);
  334.   }
  335. <<EOF>>  {
  336.     delete LexFile.Pop();
  337.     if (LexFile.IsEmpty()) 
  338.       yyterminate();
  339.     else  {
  340.       yy_switch_to_buffer(LexFile.Top().yy_state);
  341.       PAssertOS(LexFile.Top().dir.Change());
  342.     }
  343.   }
  344. ^#define  {
  345.     in_define = 1;
  346.     return HASH_DEFINE;
  347.   }
  348. ^#ifdef[ t]+[^ tn]*  { 
  349.     PString text(yytext);
  350.     if (!current_file->IsNameDefined(text.Mid(text.Find(' ')).Trim()))
  351.       BEGIN(conditional_compilation);
  352.   }
  353. ^#ifndef[ t]+[^ tn]*  {
  354.     PString text(yytext);
  355.     if (current_file->IsNameDefined(text.Mid(text.Find(' ')).Trim()))
  356.       BEGIN(conditional_compilation);
  357.   }
  358. <conditional_compilation>^#endif.*n  {
  359.     BEGIN(INITIAL);
  360.   }
  361. <conditional_compilation>n  {
  362.     LexFile.Top().line_number++;
  363.   }
  364. <conditional_compilation>.  { }
  365. ^#endif.*n  { }
  366. "//"  {
  367.     in_multiline_comment = FALSE;
  368.     BEGIN(comment_lines);
  369.   }
  370. "/*"  {
  371.     in_multiline_comment = TRUE;
  372.     BEGIN(comment_lines);
  373.   }
  374. <comment_lines>"*/"  {
  375.     if (in_multiline_comment)
  376.       BEGIN(INITIAL);
  377.   }
  378. <comment_lines>n  {
  379.     LexFile.Top().line_number++;
  380.     if (!in_multiline_comment)
  381.       BEGIN(INITIAL);
  382.   }
  383. <comment_lines>.  { }
  384. "@"  { return '@'; }
  385. "{"  { return '{'; }
  386. "}"  { return '}'; }
  387. ";"  { return ';'; }
  388. "("  { return '('; }
  389. ")"  { return ')'; }
  390. "+"  { return '+'; }
  391. "-"  { return '-'; }
  392. "*"  { return '*'; }
  393. "/"  { return '/'; }
  394. ","  { return ','; }
  395. ":"  { return ':'; }
  396. "="  { return '='; }
  397. "([^"n]|(\"))*"  {
  398.     yylval.sval = new PString(yytext);
  399.     return LITERAL;
  400.   }
  401. "0x"[0-9a-fA-F][0-9a-fA-F]*  {
  402.     yylval.ival = strtol(yytext+2, NULL, 16);
  403.     return INTEGER;
  404.   }
  405. "0"[0-7]*  {
  406.     yylval.ival = strtol(yytext, NULL, 8);
  407.     return INTEGER;
  408.   }
  409. [1-9][0-9]*  {
  410.     yylval.ival = strtol(yytext, NULL, 10);
  411.     return INTEGER;
  412.   }
  413. [a-zA-Z_][a-zA-Z0-9_]*  {
  414.     PString name = yytext;
  415.     if (in_define ||
  416.         current_file->defineDict.GetAt(name) == NULL ||
  417.         !current_file->defineDict[name].IsString()) {
  418.       yylval.sval = new PString(name);
  419.       return IDENTIFIER;
  420.     }
  421.     else {
  422.       PString tmp_str = current_file->defineDict[name];
  423.       yylval.sval = new PString(tmp_str);
  424.       return LITERAL;
  425.     }
  426.   }
  427. [ tr]  { }
  428. n  {
  429.     LexFile.Top().line_number++;
  430.     if (in_define) {
  431.       in_define = 0;
  432.       return END_DEFINE;
  433.     }
  434.   }
  435. .  { PError << StdError(Warning) << "unknown token " << yytext << endl; }
  436. %%
  437. /* End PR_LEX.L */