+/* Objective-C Extensions {{{ */
+ClassSuperOpt
+ : ":" MemberExpressionNoBF { $$ = $2; }
+ | { $$ = NULL; }
+ ;
+
+ClassFieldList
+ : "{" "}" { $$ = NULL; }
+ ;
+
+MessageScope
+ : "+" { $$ = false; }
+ | "-" { $$ = true; }
+ ;
+
+TypeOpt
+ : "(" Expression ")" { $$ = $2; }
+ | { $$ = NULL; }
+ ;
+
+MessageParameter
+ : Word ":" TypeOpt Identifier { $$ = new CYMessageParameter($1, $3, $4); }
+ ;
+
+MessageParameterListOpt
+ : MessageParameterList { $$ = $1; }
+ | { $$ = NULL; }
+ ;
+
+MessageParameterList
+ : MessageParameter MessageParameterListOpt { $1->SetNext($2); $$ = $1; }
+ ;
+
+MessageParameters
+ : MessageParameterList { $$ = $1; }
+ | Word { $$ = new CYMessageParameter($1, NULL, NULL); }
+ ;
+
+ClassMessageDeclaration
+ : MessageScope TypeOpt MessageParameters "{" FunctionBody "}" { $$ = new CYMessage($1, $2, $3, $5); }
+ ;
+
+ClassMessageDeclarationListOpt
+ : ClassMessageDeclarationListOpt ClassMessageDeclaration { $2->SetNext($1); $$ = $2; }
+ | { $$ = NULL; }
+ ;
+
+ClassName
+ : Identifier { $$ = $1; }
+ | "(" AssignmentExpression ")" { $$ = $2; }
+ ;
+
+ClassNameOpt
+ : ClassName { $$ = $1; }
+ | { $$ = NULL; }
+ ;
+
+ClassExpression
+ : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new CYClass($2, $3, $4, $5); }
+ ;
+
+CategoryStatement
+ : "@class" ClassName ClassMessageDeclarationListOpt "@end" { $$ = new CYCategory($2, $3); }
+ ;
+
+PrimaryExpression_
+ : ClassExpression { $$ = $1; }
+ ;
+
+Statement
+ : CategoryStatement
+ ;
+
+VariadicCall
+ : "," AssignmentExpression VariadicCall { $$ = new(driver.pool_) CYArgument(NULL, $2, $3); }
+ | { $$ = NULL; }
+ ;
+
+SelectorCall_
+ : SelectorCall { $$ = $1; }
+ | VariadicCall { $$ = $1; }
+ ;
+
+SelectorCall
+ : WordOpt ":" AssignmentExpression SelectorCall_ { $$ = new(driver.pool_) CYArgument($1 ?: new(driver.pool_) CYBlank(), $3, $4); }
+ ;
+
+SelectorList
+ : SelectorCall { $$ = $1; }
+ | Word { $$ = new(driver.pool_) CYArgument($1, NULL); }
+ ;
+
+MessageExpression
+ : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYSend($2, $3); }
+ ;
+
+SelectorExpressionOpt
+ : SelectorExpression_ { $$ = $1; }
+ | { $$ = NULL; }
+ ;
+
+SelectorExpression_
+ : WordOpt ":" SelectorExpressionOpt { $$ = new(driver.pool_) CYSelectorPart($1, true, $3); }
+ ;
+
+SelectorExpression
+ : SelectorExpression_ { $$ = $1; }
+ | Word { $$ = new(driver.pool_) CYSelectorPart($1, false, NULL); }
+ ;
+
+PrimaryExpression_
+ : MessageExpression { $$ = $1; }
+ | "@selector" "(" SelectorExpression ")" { $$ = new CYSelector($3); }
+ ;
+/* }}} */
+
+AssigneeExpression_
+ : "*" UnaryExpression { $$ = new(driver.pool_) CYIndirect($2); }
+ ;
+
+UnaryExpression_
+ : "&" UnaryExpression { $$ = new(driver.pool_) CYAddressOf($2); }
+ ;
+
+MemberAccess
+ : "->" Identifier { $$ = new(driver.pool_) CYIndirectMember(NULL, new(driver.pool_) CYString($2)); }
+ ;
+
+/*
+
+IfComprehension
+ : "if" "(" Expression ")"
+ ;
+
+ForComprehension
+ : "for" "(" ForInStatementInitialiser "in" Expression ")"
+ ;
+
+ComprehensionListOpt
+ : ComprehensionList
+ | IfComprehension
+ |
+ ;
+
+ComprehensionList
+ : ForComprehension ComprehensionListOpt
+ ;
+
+PrimaryExpression_
+ : "[" AssignmentExpression ComprehensionList "]"
+ ;
+
+*/
+