%{
+#include <config.h>
#include <iostream>
#include <sstream>
static Function* current_function = 0;
static Type* current_type = 0;
static Field* current_field = 0;
-static ClassMember::Visbility current_visibility;
+static ClassMember::Visibility current_visibility;
class ParseError : public std::exception
{
%token T_CLASS
%token T_STRUCT
%token T_STATIC
+%token T_SUSPEND
+%token T_CUSTOM
%token T_CONST
%token T_UNSIGNED
%token T_SIGNED
%token T_BOOL
%token T_CHAR
%token T_SHORT
-%token T_INT
%token T_LONG
-%token T_FLOAT
%token T_DOUBLE
%token T_PUBLIC
%token T_PROTECTED
;
class_declaration:
- T_CLASS T_ID '{'
+ T_CLASS T_ID
{
current_class = new Class();
current_class->name = $2;
last_docucomment = "";
current_visibility = ClassMember::PROTECTED;
}
- class_body '}' ';'
+ superclass_list '{' class_body '}' ';'
{
$$ = current_class;
}
;
+superclass_list:
+ /* empty */
+ | ':' superclasses
+;
+
+superclasses:
+ superclass
+ | superclasses ',' superclass
+;
+
+superclass:
+ superclass_visibility type_identifier
+ {
+ Class* superclass = dynamic_cast<Class*> ($2);
+ if(superclass == 0)
+ throw ParseError("SuperClass is not a Class type");
+ current_class->super_classes.push_back(superclass);
+ superclass->sub_classes.push_back(current_class);
+ }
+;
+
+superclass_visibility:
+ T_PUBLIC
+ | T_PROTECTED
+ | T_PRIVATE
+;
+
class_body: /* empty */
| class_body class_body_element
;
{
current_field = new Field();
current_field->type = $1;
+ current_field->docu_comment = last_docucomment;
+ last_docucomment = "";
current_field->name = $2;
free($2);
}
function_declaration:
type T_ID '('
{
- /*
- current_function = new Function();
- current_function->type = Function::FUNCTION;
- current_function->return_type = *($2);
- delete $2;
- current_function->name = $3;
- free($3);
- current_function->docu_comment = last_docucomment;
- last_docucomment = "";
- */
-
current_function = new Function();
current_function->type = Function::FUNCTION;
current_function->return_type = *($1);
current_function->docu_comment = last_docucomment;
last_docucomment = "";
}
- parameter_list ')' abstract_declaration ';'
+ parameter_list ')' function_attributes abstract_declaration ';'
{
$$ = current_function;
}
;
+function_attributes:
+ /* empty */
+ | T_CONST function_attributes
+ | T_CUSTOM '(' T_STRING ')' function_attributes
+ {
+ current_function->parameter_spec = $3;
+ current_function->custom = true;
+ }
+ | T_SUSPEND function_attributes
+ {
+ current_function->suspend = true;
+ }
+;
+
abstract_declaration:
/* empty */
| '=' T_INT
type_identifier:
T_ATOMIC_TYPE
{
- // search for type in current compilation unit...
$$ = $1;
}
| namespace_refs "::" T_ATOMIC_TYPE