CYTypedIdentifier *Decode_(CYPool &pool, struct sig::Type *type) {
switch (type->primitive) {
+ case sig::unknown_P: return $ CYTypedIdentifier($ CYTypeError());
+
case sig::function_P: {
_assert(type->data.signature.count != 0);
CYTypedParameter *parameter(NULL);
} }
+void CYTypeError::Output(CYOutput &out) const {
+ out << "@error";
+}
+
void CYTypeLong::Output(CYOutput &out) const {
out << "long" << specifier_;
}
virtual CYExpression *Replace(CYContext &context) = 0;
};
+struct CYTypeError :
+ CYTypeSpecifier
+{
+ CYTypeError() {
+ }
+
+ virtual CYExpression *Replace(CYContext &context);
+ virtual void Output(CYOutput &out) const;
+};
+
struct CYTypeVoid :
CYTypeSpecifier
{
return $E($ CYAssign($V(typed_->identifier_), typed_->Replace(context)));
}
+CYExpression *CYTypeError::Replace(CYContext &context) {
+ _assert(false);
+ return NULL;
+}
+
CYExpression *CYTypeModifier::Replace(CYContext &context, CYExpression *type) { $T(type)
return Replace_(context, type);
}
Type *Parse_(CYPool &pool, const char **name, char eos, bool named, Callback callback) {
char next = *(*name)++;
- if (next == '?')
- return NULL;
Type *type(new(pool) Type());
_assert(type != NULL);
parse:
switch (next) {
+ case '?': type->primitive = unknown_P; break;
case '#': type->primitive = typename_P; break;
case '(':
return pool.strdup(out.str().c_str());
} break;
+ case unknown_P: return "?";
case typename_P: return "#";
case union_P: return pool.strcat("(", Unparse(pool, &type->data.signature), ")", NULL);
case string_P: return "*";
enum Primitive {
function_P = '\0',
+ block_P = '\a',
+
+ unknown_P = '?',
typename_P = '#',
union_P = '(',
string_P = '*',
selector_P = ':',
- block_P = '?',
object_P = 'W',
boolean_P = 'B',
uchar_P = 'C',