forked from cosmonaut/wraith-lang
function parsing
parent
4bc7aca15e
commit
5861d07b07
11
ast.h
11
ast.h
|
@ -219,6 +219,17 @@ Node* MakeStatementSequenceNode(
|
|||
return node;
|
||||
}
|
||||
|
||||
Node* MakeReturnStatementNode(
|
||||
Node *expressionNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Return;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->childCount = 1;
|
||||
node->children[0] = expressionNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeFunctionSignatureNode(
|
||||
Node *identifierNode,
|
||||
Node* typeNode,
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
"string" return STRING;
|
||||
"bool" return BOOL;
|
||||
"struct" return STRUCT;
|
||||
"return" return RETURN;
|
||||
[a-zA-Z][a-zA-Z0-9]* return ID;
|
||||
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
||||
"+" return PLUS;
|
||||
|
|
34
wraith.y
34
wraith.y
|
@ -22,6 +22,7 @@ int yydebug=1;
|
|||
%token STRING
|
||||
%token BOOL
|
||||
%token STRUCT
|
||||
%token RETURN
|
||||
%token ID
|
||||
%token STRING_LITERAL
|
||||
%token PLUS
|
||||
|
@ -135,7 +136,7 @@ Expression : PrimaryExpression
|
|||
| BinaryExpression
|
||||
;
|
||||
|
||||
VariableDeclaration : Type Identifier SEMICOLON
|
||||
VariableDeclaration : Type Identifier
|
||||
{
|
||||
$$ = MakeDeclarationNode($1, $2);
|
||||
}
|
||||
|
@ -149,26 +150,25 @@ AssignmentStatement : VariableDeclaration EQUAL Expression
|
|||
$$ = MakeAssignmentNode($1, $3);
|
||||
}
|
||||
|
||||
ReturnStatement : RETURN Expression
|
||||
{
|
||||
$$ = MakeReturnStatementNode($2);
|
||||
}
|
||||
|
||||
PartialStatement : AssignmentStatement
|
||||
| VariableDeclaration
|
||||
| ReturnStatement
|
||||
;
|
||||
|
||||
Statement : PartialStatement SEMICOLON;
|
||||
|
||||
Statements : Statement
|
||||
Statements : Statement Statements
|
||||
{
|
||||
Node **statements;
|
||||
uint32_t statementCount;
|
||||
|
||||
AddStatement(stack, $1);
|
||||
|
||||
statements = GetStatements(stack, &statementCount);
|
||||
$$ = MakeStatementSequenceNode(statements, statementCount);
|
||||
PopStackFrame(stack);
|
||||
}
|
||||
| Statement Statements
|
||||
|
|
||||
{
|
||||
AddStatement(stack, $2);
|
||||
PushStackFrame(stack);
|
||||
}
|
||||
|
||||
Arguments : Arguments COMMA VariableDeclaration
|
||||
|
@ -177,7 +177,15 @@ Arguments : Arguments COMMA VariableDeclaration
|
|||
|
||||
Body : LEFT_BRACE Statements RIGHT_BRACE
|
||||
{
|
||||
$$ = $2;
|
||||
Node **statements;
|
||||
Node *statementSequence;
|
||||
uint32_t statementCount;
|
||||
|
||||
statements = GetStatements(stack, &statementCount);
|
||||
statementSequence = MakeStatementSequenceNode(statements, statementCount);
|
||||
$$ = MakeStatementSequenceNode(statements, statementCount);
|
||||
|
||||
PopStackFrame(stack);
|
||||
}
|
||||
|
||||
FunctionSignature : Type Identifier LEFT_PAREN Arguments RIGHT_PAREN
|
||||
|
@ -190,7 +198,7 @@ FunctionDeclaration : FunctionSignature Body
|
|||
$$ = MakeFunctionDeclarationNode($1, $2);
|
||||
}
|
||||
|
||||
VariableDeclarations : VariableDeclaration VariableDeclarations
|
||||
VariableDeclarations : VariableDeclaration SEMICOLON VariableDeclarations
|
||||
{
|
||||
AddDeclaration(stack, $1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue