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;
|
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* MakeFunctionSignatureNode(
|
||||||
Node *identifierNode,
|
Node *identifierNode,
|
||||||
Node* typeNode,
|
Node* typeNode,
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
"string" return STRING;
|
"string" return STRING;
|
||||||
"bool" return BOOL;
|
"bool" return BOOL;
|
||||||
"struct" return STRUCT;
|
"struct" return STRUCT;
|
||||||
|
"return" return RETURN;
|
||||||
[a-zA-Z][a-zA-Z0-9]* return ID;
|
[a-zA-Z][a-zA-Z0-9]* return ID;
|
||||||
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
||||||
"+" return PLUS;
|
"+" return PLUS;
|
||||||
|
|
34
wraith.y
34
wraith.y
|
@ -22,6 +22,7 @@ int yydebug=1;
|
||||||
%token STRING
|
%token STRING
|
||||||
%token BOOL
|
%token BOOL
|
||||||
%token STRUCT
|
%token STRUCT
|
||||||
|
%token RETURN
|
||||||
%token ID
|
%token ID
|
||||||
%token STRING_LITERAL
|
%token STRING_LITERAL
|
||||||
%token PLUS
|
%token PLUS
|
||||||
|
@ -135,7 +136,7 @@ Expression : PrimaryExpression
|
||||||
| BinaryExpression
|
| BinaryExpression
|
||||||
;
|
;
|
||||||
|
|
||||||
VariableDeclaration : Type Identifier SEMICOLON
|
VariableDeclaration : Type Identifier
|
||||||
{
|
{
|
||||||
$$ = MakeDeclarationNode($1, $2);
|
$$ = MakeDeclarationNode($1, $2);
|
||||||
}
|
}
|
||||||
|
@ -149,26 +150,25 @@ AssignmentStatement : VariableDeclaration EQUAL Expression
|
||||||
$$ = MakeAssignmentNode($1, $3);
|
$$ = MakeAssignmentNode($1, $3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnStatement : RETURN Expression
|
||||||
|
{
|
||||||
|
$$ = MakeReturnStatementNode($2);
|
||||||
|
}
|
||||||
|
|
||||||
PartialStatement : AssignmentStatement
|
PartialStatement : AssignmentStatement
|
||||||
| VariableDeclaration
|
| VariableDeclaration
|
||||||
|
| ReturnStatement
|
||||||
;
|
;
|
||||||
|
|
||||||
Statement : PartialStatement SEMICOLON;
|
Statement : PartialStatement SEMICOLON;
|
||||||
|
|
||||||
Statements : Statement
|
Statements : Statement Statements
|
||||||
{
|
{
|
||||||
Node **statements;
|
|
||||||
uint32_t statementCount;
|
|
||||||
|
|
||||||
AddStatement(stack, $1);
|
AddStatement(stack, $1);
|
||||||
|
|
||||||
statements = GetStatements(stack, &statementCount);
|
|
||||||
$$ = MakeStatementSequenceNode(statements, statementCount);
|
|
||||||
PopStackFrame(stack);
|
|
||||||
}
|
}
|
||||||
| Statement Statements
|
|
|
||||||
{
|
{
|
||||||
AddStatement(stack, $2);
|
PushStackFrame(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
Arguments : Arguments COMMA VariableDeclaration
|
Arguments : Arguments COMMA VariableDeclaration
|
||||||
|
@ -177,7 +177,15 @@ Arguments : Arguments COMMA VariableDeclaration
|
||||||
|
|
||||||
Body : LEFT_BRACE Statements RIGHT_BRACE
|
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
|
FunctionSignature : Type Identifier LEFT_PAREN Arguments RIGHT_PAREN
|
||||||
|
@ -190,7 +198,7 @@ FunctionDeclaration : FunctionSignature Body
|
||||||
$$ = MakeFunctionDeclarationNode($1, $2);
|
$$ = MakeFunctionDeclarationNode($1, $2);
|
||||||
}
|
}
|
||||||
|
|
||||||
VariableDeclarations : VariableDeclaration VariableDeclarations
|
VariableDeclarations : VariableDeclaration SEMICOLON VariableDeclarations
|
||||||
{
|
{
|
||||||
AddDeclaration(stack, $1);
|
AddDeclaration(stack, $1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue