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

IP电话/视频会议

开发平台:

Visual C++

  1. %{
  2. /*
  3.  * asn_lex.l
  4.  *
  5.  * ASN lexical analysis file
  6.  *
  7.  * ASN.1 compiler to produce C++ classes.
  8.  *
  9.  * Copyright (c) 1997-1999 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 ASN Parser.
  22.  *
  23.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  24.  *
  25.  * Portions of this code were written with the assisance of funding from
  26.  * Vovida Networks, Inc. http://www.vovida.com.
  27.  *
  28.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  29.  * All Rights Reserved.
  30.  *
  31.  * Contributor(s): ______________________________________.
  32.  *
  33.  * $Log: asn_lex.l,v $
  34.  * Revision 1.10  2000/01/19 12:33:07  robertj
  35.  * Fixed parsing of OID's in IMPORTS section.
  36.  *
  37.  * Revision 1.9  1999/07/22 06:48:55  robertj
  38.  * Added comparison operation to base ASN classes and compiled ASN code.
  39.  * Added support for ANY type in ASN parser.
  40.  *
  41.  * Revision 1.8  1999/06/09 06:58:09  robertj
  42.  * Adjusted heading comments.
  43.  *
  44.  * Revision 1.7  1999/06/07 01:56:25  robertj
  45.  * Added header comment on license.
  46.  *
  47.  * Revision 1.6  1999/06/06 05:30:28  robertj
  48.  * Support for parameterised types and type-dentifier types.
  49.  * Added ability to output multiple .cxx files.
  50.  *
  51.  * Revision 1.5  1999/02/09 01:26:50  robertj
  52.  * Fixed warning problems with #define for identifier "comment"
  53.  *
  54.  * Revision 1.4  1999/01/29 12:18:51  robertj
  55.  * Fixed warning in standard header file, caused by macro defined in flex.skel.
  56.  *
  57.  * Revision 1.3  1998/05/21 08:21:50  robertj
  58.  * GNU C++ compatibility
  59.  *
  60.  * Revision 1.2  1998/05/21 04:21:47  robertj
  61.  * Implementing more of the ASN spec.
  62.  *
  63.  * Revision 1.1  1997/12/13 09:17:49  robertj
  64.  * Initial revision
  65.  *
  66.  *
  67.  */
  68. #include <ptlib.h>
  69. #include "main.h"
  70. #include "asn_grammar.h"
  71. #include <ctype.h>
  72. extern FILE * yyin;
  73. extern unsigned lineNumber;
  74. int LexEcho = FALSE;
  75. #define YY_USER_ACTION if (LexEcho) cout << yytext << flush;
  76. int ReferenceTokenContext = MODULEREFERENCE;
  77. int IdentifierTokenContext = IDENTIFIER;
  78. int BraceTokenContext = '{';
  79. int NullTokenContext = NULL_TYPE;
  80. int InMacroContext = FALSE;
  81. int HasObjectTypeMacro = FALSE;
  82. int InMIBContext = FALSE;
  83. TypesList * CurrentImportList = NULL;
  84. extern "C" int yywrap() { return 1; }
  85. static int TokenSelect(int context, int token1, int token2)
  86. {
  87.   if (context)
  88.     return token1;
  89.   yylval.sval = new PString(yytext);
  90.   return token2;
  91. }
  92. %}
  93. %x comment_line
  94. %%
  95. "::="    { return ASSIGNMENT; }
  96. "ABSENT"                           { return ABSENT; }              
  97. "ABSTRACT-SYNTAX"                  { return ABSTRACT_SYNTAX; }
  98. "ALL"                              { return ALL; }
  99. "ANY"                              { return ANY; }
  100. "APPLICATION"                      { return APPLICATION; }
  101. "AUTOMATIC"                        { return AUTOMATIC; }
  102. "BEGIN"                            { return BEGIN_t; }
  103. "BIT"                              { return BIT; }
  104. "BMPString"                        { return BMPString; }
  105. "BOOLEAN"                          { return BOOLEAN_t; }
  106. "BY"                               { return BY; }
  107. "CHARACTER"                        { return CHARACTER; }
  108. "CHOICE"                           { return CHOICE; }
  109. "CLASS"                            { return CLASS; }
  110. "COMPONENT"                        { return COMPONENT; }
  111. "COMPONENTS"                       { return COMPONENTS; }
  112. "CONSTRAINED"                      { return CONSTRAINED; }
  113. "DEFAULT"                          { return DEFAULT; }
  114. "DEFINED"                          { return DEFINED; }
  115. "DEFINITIONS"                      { return DEFINITIONS; }
  116. "EMBEDDED"                         { return EMBEDDED; }
  117. "END"                              { return END; }
  118. "ENUMERATED"                       { return ENUMERATED; }
  119. "EXCEPT"                           { return EXCEPT; }
  120. "EXPLICIT"                         { return EXPLICIT; }
  121. "EXPORTS"                          { return EXPORTS; }
  122. "EXTERNAL"                         { return EXTERNAL; }
  123. "FALSE"                            { return FALSE_t; }
  124. "FROM"                             { return FROM; }
  125. "GeneralString"                    { return GeneralString; }
  126. "GraphicString"                    { return GraphicString; }
  127. "IA5String"                        { return IA5String; }
  128. "TYPE-IDENTIFIER"                  { return TYPE_IDENTIFIER; }
  129. "IDENTIFIER"                       { return IDENTIFIER_t; }
  130. "IMPLICIT"                         { return IMPLICIT; }
  131. "IMPORTS"                          { return IMPORTS; }
  132. "INCLUDES"                         { return INCLUDES; }
  133. "INSTANCE"                         { return INSTANCE; }
  134. "INTEGER"                          { return INTEGER_t; }
  135. "INTERSECTION"                     { return INTERSECTION; }
  136. "ISO646String"                     { return ISO646String; }
  137. "MACRO"    { return MACRO; }
  138. "MAX"                              { return MAX; }
  139. "MIN"                              { return MIN; }
  140. "MINUS-INFINITY"                   { return MINUS_INFINITY; }
  141. "NOTATION"    { return NOTATION; }
  142. "NULL"                             { return NullTokenContext; }
  143. "NumericString"                    { return NumericString; }
  144. "OBJECT"                           { return OBJECT; }
  145. "OCTET"                            { return OCTET; }
  146. "OF"                               { return OF_t; }
  147. "OPTIONAL"                         { return OPTIONAL_t; }
  148. "PDV"                              { return PDV; }
  149. "PLUS-INFINITY"                    { return PLUS_INFINITY; }
  150. "PRESENT"                          { return PRESENT; }
  151. "PrintableString"                  { return PrintableString; }
  152. "PRIVATE"                          { return PRIVATE; }
  153. "REAL"                             { return REAL; }
  154. "SEQUENCE"                         { return SEQUENCE; }
  155. "SET"                              { return SET; }
  156. "SIZE"                             { return SIZE_t; }
  157. "STRING"                           { return STRING; }
  158. "SYNTAX"                           { return SYNTAX; }
  159. "T61String"                        { return T61String; }
  160. "TAGS"                             { return TAGS; }
  161. "TeletexString"                    { return TeletexString; }
  162. "TRUE"                             { return TRUE_t; }
  163. "TYPE"    { return TYPE_t; }
  164. "UNION"                            { return UNION; }
  165. "UNIQUE"                           { return UNIQUE; }
  166. "UNIVERSAL"                        { return UNIVERSAL; }
  167. "UniversalString"                  { return UniversalString; }
  168. "VALUE"    { return VALUE; }
  169. "VideotexString"                   { return VideotexString; }
  170. "VisibleString"                    { return VisibleString; }
  171. "WITH"                             { return WITH; }
  172. "string"                           { return TokenSelect(InMacroContext, string_t, IDENTIFIER); }
  173. "identifier"                       { return TokenSelect(InMacroContext, identifier_t, IDENTIFIER); }
  174. "number"                           { return TokenSelect(InMacroContext, number_t, IDENTIFIER); }
  175. "empty"                            { return TokenSelect(InMacroContext, empty_t, IDENTIFIER); }
  176. "type"                             { return TokenSelect(InMacroContext, type_t, IDENTIFIER); }
  177. "value"                            { return TokenSelect(InMacroContext, value_t, IDENTIFIER); }
  178. "OBJECT-TYPE"    { return TokenSelect(HasObjectTypeMacro, OBJECT_TYPE, ReferenceTokenContext); }
  179. "TRAP-TYPE"    { return TokenSelect(HasObjectTypeMacro, TRAP_TYPE, ReferenceTokenContext); }
  180. "ACCESS"    { return TokenSelect(InMIBContext, ACCESS, ReferenceTokenContext); }
  181. "STATUS"    { return TokenSelect(InMIBContext, STATUS, ReferenceTokenContext); }
  182. "read-only"    { return TokenSelect(InMIBContext, read_only_t, IDENTIFIER); }
  183. "read-write"    { return TokenSelect(InMIBContext, read_write_t, IDENTIFIER); }
  184. "write-only"    { return TokenSelect(InMIBContext, write_only_t, IDENTIFIER); }
  185. "not-accessible"    { return TokenSelect(InMIBContext, not_accessible_t, IDENTIFIER); }
  186. "mandatory"    { return TokenSelect(InMIBContext, mandatory_t, IDENTIFIER); }
  187. "optional"    { return TokenSelect(InMIBContext, optional_t, IDENTIFIER); }
  188. "obsolete"    { return TokenSelect(InMIBContext, obsolete_t, IDENTIFIER); }
  189. "deprecated"    { return TokenSelect(InMIBContext, deprecated_t, IDENTIFIER); }
  190. "DESCRIPTION"    { return TokenSelect(InMIBContext, DESCRIPTION_t, ReferenceTokenContext); }
  191. "REFERENCE"    { return TokenSelect(InMIBContext, REFERENCE_t, ReferenceTokenContext); }
  192. "INDEX"    { return TokenSelect(InMIBContext, INDEX_t, ReferenceTokenContext); }
  193. "DEFVAL"    { return TokenSelect(InMIBContext, DEFVAL_t, ReferenceTokenContext); }
  194. "ENTERPRISE"    { return TokenSelect(InMIBContext, ENTERPRISE, ReferenceTokenContext); }
  195. "VARIABLES"    { return TokenSelect(InMIBContext, VARIABLES, ReferenceTokenContext); }
  196.                                                                  
  197. "--" {
  198.     BEGIN(comment_line);
  199.   }
  200. <comment_line>"--"  {
  201.     BEGIN(INITIAL);
  202.   }
  203. <comment_line>n  {
  204.     lineNumber++;
  205.     BEGIN(INITIAL);
  206.   }
  207. <comment_line>. {
  208. }
  209. "@"  { return '@'; }
  210. "{"  { return BraceTokenContext; }
  211. "}"  { return '}'; }
  212. "["  { return '['; }
  213. "]"  { return ']'; }
  214. "("  { return '('; }
  215. ")"  { return ')'; }
  216. "<"  { return '<'; }
  217. ">"  { return '>'; }
  218. "|"  { return '|'; }
  219. ";"  { return ';'; }
  220. "+"  { return '+'; }
  221. "-"  { return '-'; }
  222. "*"  { return '*'; }
  223. "/"  { return '/'; }
  224. ","  { return ','; }
  225. "."  { return '.'; }
  226. ":"  { return ':'; }
  227. "="  { return '='; }
  228. '|'  { return '|'; }
  229. "^"  { return '^'; }
  230. ("[^"]*")("[^"]*")*  {
  231.     PString s = yytext;
  232.     PINDEX pos;
  233.     while ((pos = s.Find('n')) != P_MAX_INDEX) {
  234.       PINDEX start = pos;
  235.       while (start > 0 && isspace(s[start-1]))
  236. start--;
  237.       while (isspace(s[pos]))
  238. pos++;
  239.       s.Splice(" ", start, pos - start);
  240.       lineNumber++;
  241.     }
  242.     yylval.sval = new PString(s);
  243.     return CSTRING;
  244.   }
  245. [0-9][0-9]*  {
  246.     const char * ptr = yytext;
  247.     yylval.ival = 0;
  248.     while (*ptr != '')
  249.       yylval.ival = yylval.ival * 10 + *ptr++ - '0';
  250.     return INTEGER;
  251.   }
  252. ([a-z]|([a-z][a-zA-Z0-9_-]*[a-zA-Z0-9_]))  {
  253.     yylval.sval = new PString(yytext);
  254.     if (CurrentImportList != NULL) {
  255.       ImportedType searchArg(new PString(yytext), FALSE);
  256.       if (CurrentImportList->GetValuesIndex(searchArg) != P_MAX_INDEX)
  257.         return IMPORT_IDENTIFIER;
  258.     }
  259.     return IdentifierTokenContext;
  260.   }
  261. "&"([a-z]|([a-z][a-zA-Z0-9_-]*[a-zA-Z0-9_]))  {   /* See X.681 section 7.5 */
  262.     yylval.sval = new PString(yytext);
  263.     return VALUEFIELDREFERENCE;
  264.   }
  265. "&"([A-Z]|([A-Z][a-zA-Z0-9_-]*[a-zA-Z0-9_]))  {   /* See X.681 section 7.4 */
  266.     yylval.sval = new PString(yytext);
  267.     return TYPEFIELDREFERENCE;
  268.   }
  269. ([A-Z]|([A-Z][a-zA-Z0-9_-]*[a-zA-Z0-9_]))  {   /* See X.680 section 9.2 */
  270.     yylval.sval = new PString(yytext);
  271.     if (CurrentImportList != NULL &&
  272. CurrentImportList->GetValuesIndex(SearchType(*yylval.sval)) != P_MAX_INDEX)
  273.       return IMPORT_IDENTIFIER;
  274.     return ReferenceTokenContext;
  275.   }
  276. [ tr]  { }
  277. n {
  278.     lineNumber++;
  279.   }
  280. .  { PError << StdError(Fatal) << "unknown token " << yytext << endl; }
  281. %%
  282. /* End PR_LEX.L */