|
@@ -80,7 +80,7 @@ typedef qlow::CodePosition QLOW_PARSER_LTYPE;
|
|
|
|
|
|
%initial-action
|
|
|
{
|
|
|
- @$.filename = qlow_parser_filename;
|
|
|
+ @$.filename = qlow_parser_filename;
|
|
|
};
|
|
|
|
|
|
//%define api.location.type {qlow::CodePosition}
|
|
@@ -128,7 +128,7 @@ typedef qlow::CodePosition QLOW_PARSER_LTYPE;
|
|
|
%token <string> IDENTIFIER
|
|
|
%token <string> INT_LITERAL
|
|
|
%token <token> TRUE FALSE
|
|
|
-%token <token> CLASS DO END IF ELSE WHILE RETURN NEW
|
|
|
+%token <token> CLASS DO END IF ELSE WHILE RETURN NEW EXTERN
|
|
|
%token <token> NEW_LINE
|
|
|
%token <token> SEMICOLON COLON COMMA DOT ASSIGN EQUALS NOT_EQUALS
|
|
|
%token <token> ROUND_LEFT ROUND_RIGHT SQUARE_LEFT SQUARE_RIGHT
|
|
@@ -140,6 +140,7 @@ typedef qlow::CodePosition QLOW_PARSER_LTYPE;
|
|
|
%type <featureDeclaration> featureDeclaration
|
|
|
%type <fieldDeclaration> fieldDeclaration
|
|
|
%type <methodDefinition> methodDefinition
|
|
|
+%type <methodDefinition> externMethodDeclaration
|
|
|
%type <featureList> featureList
|
|
|
%type <argumentList> argumentList
|
|
|
%type <statements> statements
|
|
@@ -191,7 +192,9 @@ topLevel:
|
|
|
$2 = nullptr;
|
|
|
}
|
|
|
|
|
|
|
- topLevel externMethodDefinition {
|
|
|
+ topLevel externMethodDeclaration {
|
|
|
+ parsedClasses->push_back(std::move(std::unique_ptr<qlow::ast::MethodDefinition>($2)));
|
|
|
+ $2 = nullptr;
|
|
|
}
|
|
|
|
|
|
|
topLevel error methodDefinition {
|
|
@@ -276,19 +279,24 @@ fieldDeclaration:
|
|
|
|
|
|
externMethodDeclaration:
|
|
|
EXTERN IDENTIFIER COLON type {
|
|
|
-
|
|
|
+ $$ = new MethodDefinition(std::unique_ptr<qlow::ast::Type>($4), *$2, @$);
|
|
|
+ delete $2; $2 = nullptr;
|
|
|
}
|
|
|
|
|
|
|
EXTERN IDENTIFIER {
|
|
|
-
|
|
|
+ $$ = new MethodDefinition(nullptr, *$2, @$);
|
|
|
+ delete $2; $2 = nullptr;
|
|
|
}
|
|
|
|
|
|
|
EXTERN IDENTIFIER ROUND_LEFT argumentList ROUND_RIGHT {
|
|
|
-
|
|
|
+ $$ = new MethodDefinition(nullptr, *$2, std::move(*$4), @$);
|
|
|
+ delete $2; delete $4; $2 = nullptr; $4 = nullptr;
|
|
|
}
|
|
|
|
|
|
|
EXTERN IDENTIFIER ROUND_LEFT argumentList ROUND_RIGHT COLON type {
|
|
|
-
|
|
|
+ $$ = new MethodDefinition(std::unique_ptr<qlow::ast::Type>($7),
|
|
|
+ *$2, std::move(*$4), @$);
|
|
|
+ delete $2; delete $4; $2 = nullptr; $4 = nullptr;
|
|
|
};
|
|
|
|
|
|
|
|
@@ -342,8 +350,8 @@ doEndBlock:
|
|
|
$$ = new DoEndBlock(std::move(*$2), @$);
|
|
|
delete $2; $2 = nullptr;
|
|
|
};
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
ifElseBlock:
|
|
|
IF expression doEndBlock {
|
|
|
$$ = new IfElseBlock(std::unique_ptr<Expression>($2),
|