@@ -1087,99 +1087,102 @@ exprt smt2_parsert::expression()
1087
1087
1088
1088
typet smt2_parsert::sort ()
1089
1089
{
1090
+ // a sort is one of the following three cases:
1091
+ // SYMBOL
1092
+ // ( _ SYMBOL ...
1093
+ // ( SYMBOL ...
1090
1094
switch (next_token ())
1091
1095
{
1092
1096
case smt2_tokenizert::SYMBOL:
1093
- {
1094
- const std::string &buffer = smt2_tokenizer.get_buffer ();
1095
-
1096
- if (buffer==" Bool" )
1097
- return bool_typet ();
1098
- else if (buffer==" Int" )
1099
- return integer_typet ();
1100
- else if (buffer==" Real" )
1101
- return real_typet ();
1102
- else
1103
- throw error () << " unexpected sort: '" << buffer << ' \' ' ;
1104
- }
1097
+ break ;
1105
1098
1106
1099
case smt2_tokenizert::OPEN:
1107
- if (next_token () != smt2_tokenizert::SYMBOL)
1100
+ if (smt2_tokenizer. next_token () != smt2_tokenizert::SYMBOL)
1108
1101
throw error (" expected symbol after '(' in a sort " );
1109
1102
1110
1103
if (smt2_tokenizer.get_buffer () == " _" )
1111
1104
{
1112
- // indexed identifier
1113
1105
if (next_token () != smt2_tokenizert::SYMBOL)
1114
1106
throw error (" expected symbol after '_' in a sort" );
1107
+ }
1108
+ break ;
1115
1109
1116
- if (smt2_tokenizer.get_buffer () == " BitVec" )
1117
- {
1118
- if (next_token () != smt2_tokenizert::NUMERAL)
1119
- throw error (" expected numeral as bit-width" );
1110
+ case smt2_tokenizert::CLOSE:
1111
+ case smt2_tokenizert::NUMERAL:
1112
+ case smt2_tokenizert::STRING_LITERAL:
1113
+ case smt2_tokenizert::NONE:
1114
+ case smt2_tokenizert::KEYWORD:
1115
+ throw error () << " unexpected token in a sort: '"
1116
+ << smt2_tokenizer.get_buffer () << ' \' ' ;
1120
1117
1121
- auto width = std::stoll (smt2_tokenizer.get_buffer ());
1118
+ case smt2_tokenizert::END_OF_FILE:
1119
+ throw error () << " unexpected end-of-file in a sort" ;
1120
+ }
1122
1121
1123
- // eat the ')'
1124
- if (next_token () != smt2_tokenizert::CLOSE)
1125
- throw error (" expected ')' at end of sort" );
1122
+ // now we have a SYMBOL
1123
+ const auto &token = smt2_tokenizer.get_buffer ();
1126
1124
1127
- return unsignedbv_typet (width);
1128
- }
1129
- else if (smt2_tokenizer.get_buffer () == " FloatingPoint" )
1130
- {
1131
- if (next_token () != smt2_tokenizert::NUMERAL)
1132
- throw error (" expected numeral as bit-width" );
1125
+ const auto s_it = sorts.find (token);
1133
1126
1134
- const auto width_e = std::stoll (smt2_tokenizer.get_buffer ());
1127
+ if (s_it == sorts.end ())
1128
+ throw error () << " unexpected sort: '" << token << ' \' ' ;
1135
1129
1136
- if ( next_token () != smt2_tokenizert::NUMERAL)
1137
- throw error ( " expected numeral as bit-width " );
1130
+ return s_it-> second ();
1131
+ }
1138
1132
1139
- const auto width_f = std::stoll (smt2_tokenizer.get_buffer ());
1133
+ void smt2_parsert::setup_sorts ()
1134
+ {
1135
+ sorts[" Bool" ] = [] { return bool_typet (); };
1136
+ sorts[" Int" ] = [] { return integer_typet (); };
1137
+ sorts[" Real" ] = [] { return real_typet (); };
1140
1138
1141
- // consume the ')'
1142
- if (next_token () != smt2_tokenizert::CLOSE )
1143
- throw error (" expected ')' at end of sort " );
1139
+ sorts[ " BitVec " ] = [ this ] {
1140
+ if (next_token () != smt2_tokenizert::NUMERAL )
1141
+ throw error (" expected numeral as bit-width " );
1144
1142
1145
- return ieee_float_spect (width_f - 1 , width_e).to_type ();
1146
- }
1147
- else
1148
- throw error () << " unexpected sort: '" << smt2_tokenizer.get_buffer ()
1149
- << ' \' ' ;
1150
- }
1151
- else if (smt2_tokenizer.get_buffer () == " Array" )
1152
- {
1153
- // this gets two sorts as arguments, domain and range
1154
- auto domain = sort ();
1155
- auto range = sort ();
1143
+ auto width = std::stoll (smt2_tokenizer.get_buffer ());
1156
1144
1157
- // eat the ')'
1158
- if (next_token () != smt2_tokenizert::CLOSE)
1159
- throw error (" expected ')' at end of Array sort" );
1145
+ // eat the ')'
1146
+ if (next_token () != smt2_tokenizert::CLOSE)
1147
+ throw error (" expected ')' at end of sort" );
1160
1148
1161
- // we can turn arrays that map an unsigned bitvector type
1162
- // to something else into our 'array_typet'
1163
- if (domain.id () == ID_unsignedbv)
1164
- return array_typet (range, infinity_exprt (domain));
1165
- else
1166
- throw error (" unsupported array sort" );
1167
- }
1168
- else
1169
- throw error () << " unexpected sort: '" << smt2_tokenizer.get_buffer ()
1170
- << ' \' ' ;
1149
+ return unsignedbv_typet (width);
1150
+ };
1171
1151
1172
- case smt2_tokenizert::CLOSE:
1173
- case smt2_tokenizert::NUMERAL:
1174
- case smt2_tokenizert::STRING_LITERAL:
1175
- case smt2_tokenizert::END_OF_FILE:
1176
- case smt2_tokenizert::NONE:
1177
- case smt2_tokenizert::KEYWORD:
1178
- throw error () << " unexpected token in a sort: '"
1179
- << smt2_tokenizer.get_buffer () << ' \' ' ;
1180
- }
1152
+ sorts[" FloatingPoint" ] = [this ] {
1153
+ if (next_token () != smt2_tokenizert::NUMERAL)
1154
+ throw error (" expected numeral as bit-width" );
1181
1155
1182
- UNREACHABLE;
1156
+ const auto width_e = std::stoll (smt2_tokenizer.get_buffer ());
1157
+
1158
+ if (next_token () != smt2_tokenizert::NUMERAL)
1159
+ throw error (" expected numeral as bit-width" );
1160
+
1161
+ const auto width_f = std::stoll (smt2_tokenizer.get_buffer ());
1162
+
1163
+ // consume the ')'
1164
+ if (next_token () != smt2_tokenizert::CLOSE)
1165
+ throw error (" expected ')' at end of sort" );
1166
+
1167
+ return ieee_float_spect (width_f - 1 , width_e).to_type ();
1168
+ };
1169
+
1170
+ sorts[" Array" ] = [this ] {
1171
+ // this gets two sorts as arguments, domain and range
1172
+ auto domain = sort ();
1173
+ auto range = sort ();
1174
+
1175
+ // eat the ')'
1176
+ if (next_token () != smt2_tokenizert::CLOSE)
1177
+ throw error (" expected ')' at end of Array sort" );
1178
+
1179
+ // we can turn arrays that map an unsigned bitvector type
1180
+ // to something else into our 'array_typet'
1181
+ if (domain.id () == ID_unsignedbv)
1182
+ return array_typet (range, infinity_exprt (domain));
1183
+ else
1184
+ throw error (" unsupported array sort" );
1185
+ };
1183
1186
}
1184
1187
1185
1188
smt2_parsert::signature_with_parameter_idst
0 commit comments