1 %option nounput 2 %option noinput 3 %option yylineno 4 5 %{ /* -*- C -*- */ 6 /* 7 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana 8 * University Research and Technology 9 * Corporation. All rights reserved. 10 * Copyright (c) 2004-2006 The University of Tennessee and The University 11 * of Tennessee Research Foundation. All rights 12 * reserved. 13 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 14 * University of Stuttgart. All rights reserved. 15 * Copyright (c) 2004-2005 The Regents of the University of California. 16 * All rights reserved. 17 * Copyright (c) 2012 Los Alamos National Security, LLC. All rights 18 * reserved. 19 * $COPYRIGHT$ 20 * 21 * Additional copyrights may follow 22 * 23 * $HEADER$ 24 */ 25 26 #include "opal_config.h" 27 28 #include <stdio.h> 29 #ifdef HAVE_UNISTD_H 30 #include <unistd.h> 31 #endif 32 33 #include "opal/util/keyval/keyval_lex.h" 34 35 /* 36 * local functions 37 */ 38 39 BEGIN_C_DECLS 40 41 int opal_util_keyval_yywrap(void); 42 43 END_C_DECLS 44 45 /* 46 * global variables 47 */ 48 int opal_util_keyval_yynewlines = 1; 49 bool opal_util_keyval_parse_done = false; 50 char *opal_util_keyval_string = NULL; 51 52 %} 53 54 WHITE [\f\t\v ] 55 CHAR [A-Za-z0-9_\-\.] 56 57 %x VALUE 58 %x comment 59 %x MCA_VALUE 60 61 %% 62 63 {WHITE}*\n { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 64 #.*\n { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 65 "//".*\n { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 66 67 "/*" { BEGIN(comment); 68 return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 69 <comment>[^*\n]* ; /* Eat up non '*'s */ 70 <comment>"*"+[^*/\n]* ; /* Eat '*'s not followed by a '/' */ 71 <comment>\n { opal_util_keyval_yynewlines++; 72 return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 73 <comment>"*"+"/" { BEGIN(INITIAL); /* Done with Block Comment */ 74 return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 75 76 {WHITE}*"="{WHITE}* { BEGIN(VALUE); return OPAL_UTIL_KEYVAL_PARSE_EQUAL; } 77 {WHITE}+ ; /* whitespace */ 78 {CHAR}+ { return OPAL_UTIL_KEYVAL_PARSE_SINGLE_WORD; } 79 80 <VALUE>{WHITE}*\n { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 81 <VALUE>[^\n]*[^\t \n]/[\t ]* { return OPAL_UTIL_KEYVAL_PARSE_VALUE; } 82 83 <MCA_VALUE>[^\n \t]+ { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; } 84 <MCA_VALUE>"'"[^\n]*"'"{WHITE}+ { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; } 85 <MCA_VALUE>"\""[^\n]*"\""{WHITE}+ { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; } 86 <MCA_VALUE>{WHITE}*\n { BEGIN(INITIAL); BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; } 87 88 "-"?"-mca"{WHITE}+{CHAR}+{WHITE}+ {BEGIN(MCA_VALUE); return OPAL_UTIL_KEYVAL_PARSE_MCAVAR; } 89 "-"?"-x"{WHITE}+{CHAR}+{WHITE}*"="{WHITE}* {BEGIN(MCA_VALUE); return OPAL_UTIL_KEYVAL_PARSE_ENVEQL; } 90 "-"?"-x"{WHITE}+{CHAR}+{WHITE}*/[^=] { return OPAL_UTIL_KEYVAL_PARSE_ENVVAR; } 91 92 . { return OPAL_UTIL_KEYVAL_PARSE_ERROR; } 93 94 %% 95 96 /* Old flex (2.5.4a? and older) does not define a destroy function */ 97 #if !defined(YY_FLEX_SUBMINOR_VERSION) 98 #define YY_FLEX_SUBMINOR_VERSION 0 99 #endif 100 101 #if (YY_FLEX_MAJOR_VERSION < 2) || (YY_FLEX_MAJOR_VERSION == 2 && (YY_FLEX_MINOR_VERSION < 5 || (YY_FLEX_MINOR_VERSION == 5 && YY_FLEX_SUBMINOR_VERSION < 5))) 102 int opal_util_keyval_yylex_destroy(void) 103 { 104 if (NULL != YY_CURRENT_BUFFER) { 105 yy_delete_buffer(YY_CURRENT_BUFFER); 106 #if defined(YY_CURRENT_BUFFER_LVALUE) 107 YY_CURRENT_BUFFER_LVALUE = NULL; 108 #else 109 YY_CURRENT_BUFFER = NULL; 110 #endif /* YY_CURRENT_BUFFER_LVALUE */ 111 } 112 return YY_NULL; 113 } 114 #endif 115 opal_util_keyval_yywrap(void)116int opal_util_keyval_yywrap(void) 117 { 118 opal_util_keyval_parse_done = true; 119 return 1; 120 } 121 122 /* 123 * Ensure that we have a valid yybuffer to use. Specifically, if this 124 * scanner is invoked a second time, finish_parsing() (above) will 125 * have been executed, and the current buffer will have been freed. 126 * Flex doesn't recognize this fact because as far as it's concerned, 127 * its internal state was already initialized, so it thinks it should 128 * have a valid buffer. Hence, here we ensure to give it a valid 129 * buffer. 130 */ opal_util_keyval_init_buffer(FILE * file)131int opal_util_keyval_init_buffer(FILE *file) 132 { 133 YY_BUFFER_STATE buf = yy_create_buffer(file, YY_BUF_SIZE); 134 yy_switch_to_buffer(buf); 135 136 return 0; 137 } 138