00001
00002
00003
00004
00005
00006
00007
00008
#include <antlr/config.hpp>
00009
#include <antlr/IOException.hpp>
00010
00011
#include <iostream>
00012
#include <cctype>
00013
#include <string>
00014
00015
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00016
namespace antlr {
00017
#endif
00018
00022 ANTLR_USE_NAMESPACE(std)istream& eatwhite( ANTLR_USE_NAMESPACE(std)istream& is )
00023 {
00024
char c;
00025
while( is.get(c) )
00026 {
00027
#ifdef ANTLR_CCTYPE_NEEDS_STD
00028
if( !
ANTLR_USE_NAMESPACE(std)isspace(c) )
00029
#else
00030
if( !isspace(c) )
00031
#endif
00032
{
00033 is.putback(c);
00034
break;
00035 }
00036 }
00037
return is;
00038 }
00039
00046 ANTLR_USE_NAMESPACE(std)string read_string( ANTLR_USE_NAMESPACE(std)istream& in )
00047 {
00048
char ch;
00049
ANTLR_USE_NAMESPACE(std)string ret(
"");
00050
00051
enum { START, READING, ESCAPE, FINISHED };
00052
int state = START;
00053
00054
eatwhite(in);
00055
00056
while( state != FINISHED && in.get(ch) )
00057 {
00058
switch( state )
00059 {
00060
case START:
00061
00062
if( ch !=
'"' )
00063
throw IOException(
"string must start with '\"'");
00064 state = READING;
00065
continue;
00066
case READING:
00067
00068
if( ch ==
'\\' )
00069 {
00070 state = ESCAPE;
00071
continue;
00072 }
00073
if( ch ==
'"' )
00074 {
00075 state = FINISHED;
00076
continue;
00077 }
00078 ret += ch;
00079
continue;
00080
case ESCAPE:
00081
switch(ch)
00082 {
00083
case '\\':
00084 ret += ch;
00085 state = READING;
00086
continue;
00087
case '"':
00088 ret += ch;
00089 state = READING;
00090
continue;
00091
case '0':
00092 ret +=
'\0';
00093 state = READING;
00094
continue;
00095
default:
00096 ret +=
'\\';
00097 ret += ch;
00098 state = READING;
00099
continue;
00100 }
00101 }
00102 }
00103
if( state != FINISHED )
00104
throw IOException(
"badly formatted string: "+ret);
00105
00106
return ret;
00107 }
00108
00109
00110
00111
00112 ANTLR_USE_NAMESPACE(std)string read_identifier( ANTLR_USE_NAMESPACE(std)istream& in )
00113 {
00114
char ch;
00115
ANTLR_USE_NAMESPACE(std)string ret(
"");
00116
00117
eatwhite(in);
00118
00119
while( in.get(ch) )
00120 {
00121
#ifdef ANTLR_CCTYPE_NEEDS_STD
00122
if(
ANTLR_USE_NAMESPACE(std)isupper(ch) ||
00123
ANTLR_USE_NAMESPACE(std)islower(ch) ||
00124
ANTLR_USE_NAMESPACE(std)isdigit(ch) ||
00125 ch ==
'_' )
00126
#else
00127
if( isupper(ch) || islower(ch) || isdigit(ch) || ch ==
'_' )
00128
#endif
00129
ret += ch;
00130
else
00131 {
00132 in.putback(ch);
00133
break;
00134 }
00135 }
00136
return ret;
00137 }
00138
00148 void read_AttributeNValue(
ANTLR_USE_NAMESPACE(std)istream& in,
00149
ANTLR_USE_NAMESPACE(std)string& attribute,
00150
ANTLR_USE_NAMESPACE(std)string& value )
00151 {
00152 attribute =
read_identifier(in);
00153
00154
char ch;
00155
if( in.get(ch) && ch ==
'=' )
00156 value =
read_string(in);
00157
else
00158
throw IOException(
"invalid attribute=value thing "+attribute);
00159 }
00160
00161
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00162
}
00163
#endif