2021-04-18 22:29:54 +00:00
%code requires {
2021-04-29 19:42:51 +00:00
#include "../src/ast.h"
2021-04-18 22:29:54 +00:00
}
2021-04-16 21:40:28 +00:00
%{
#include <stdio.h>
2021-04-28 22:21:51 +00:00
#include "../src/ast.h"
2021-04-18 22:29:54 +00:00
2021-04-29 19:42:51 +00:00
void yyerror(FILE *fp, Node **pRootNode, char *s)
2021-04-16 21:40:28 +00:00
{
fprintf (stderr, "%s\n", s);
}
2021-04-18 20:14:50 +00:00
2021-04-18 21:10:15 +00:00
extern char *yytext;
extern int yylex (void);
extern FILE *yyin;
2021-04-16 21:40:28 +00:00
%}
2021-04-18 21:10:15 +00:00
%define api.value.type {struct Node*}
2021-04-21 02:00:18 +00:00
%token VOID
2021-04-16 21:40:28 +00:00
%token INT
%token UINT
%token FLOAT
%token DOUBLE
2021-04-16 07:35:35 +00:00
%token STRING
2021-04-16 21:40:28 +00:00
%token BOOL
2021-06-02 19:44:36 +00:00
%token MEMORYADDRESS
2021-04-18 20:14:50 +00:00
%token STRUCT
2021-06-07 19:52:57 +00:00
%token INTERFACE
2021-04-18 20:30:50 +00:00
%token RETURN
2021-04-22 07:35:42 +00:00
%token STATIC
2021-04-24 19:59:30 +00:00
%token REFERENCE
2021-04-28 19:49:45 +00:00
%token ALLOC
2021-04-29 04:25:25 +00:00
%token IF
%token ELSE
2021-04-30 06:49:35 +00:00
%token IN
%token FOR
2021-04-21 02:00:18 +00:00
%token NUMBER
2021-04-16 21:40:28 +00:00
%token ID
%token STRING_LITERAL
2021-04-16 07:35:35 +00:00
%token PLUS
%token MINUS
2021-04-20 17:47:40 +00:00
%token STAR
%token SLASH
%token PERCENT
2021-04-16 07:35:35 +00:00
%token EQUAL
%token LESS_THAN
%token GREATER_THAN
%token QUOTE
%token BANG
%token BAR
%token AMPERSAND
%token POINT
%token COMMA
%token SEMICOLON
%token COLON
%token QUESTION
2021-06-02 19:33:01 +00:00
%token AT
2021-04-16 07:35:35 +00:00
%token LEFT_PAREN
%token RIGHT_PAREN
%token LEFT_BRACE
%token RIGHT_BRACE
%token LEFT_BRACKET
%token RIGHT_BRACKET
%token COMMENT
%token NEWLINE
2021-04-29 19:42:51 +00:00
%parse-param { FILE* fp } { Node **pRootNode }
2021-04-16 21:40:28 +00:00
2021-04-23 00:19:35 +00:00
%define parse.error verbose
2021-04-30 06:49:35 +00:00
%left GREATER_THAN LESS_THAN EQUAL
2021-04-16 07:35:35 +00:00
%left PLUS MINUS
2021-04-30 06:49:35 +00:00
%left STAR PERCENT
%left BANG BAR
2021-04-16 07:35:35 +00:00
%left LEFT_PAREN RIGHT_PAREN
%%
2021-04-21 02:00:18 +00:00
Program : TopLevelDeclarations
2021-04-16 07:35:35 +00:00
{
2021-04-29 19:42:51 +00:00
*pRootNode = $1;
2021-04-16 07:35:35 +00:00
}
2021-04-24 19:59:30 +00:00
BaseType : VOID
2021-04-21 02:00:18 +00:00
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(Void);
2021-04-21 02:00:18 +00:00
}
| INT
2021-04-18 20:14:50 +00:00
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(Int);
2021-04-18 20:14:50 +00:00
}
| UINT
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(UInt);
2021-04-18 20:14:50 +00:00
}
| FLOAT
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(Float);
2021-04-18 20:14:50 +00:00
}
| DOUBLE
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(Double);
2021-04-18 20:14:50 +00:00
}
| STRING
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(String);
2021-04-18 20:14:50 +00:00
}
| BOOL
{
2021-04-24 19:59:30 +00:00
$$ = MakePrimitiveTypeNode(Bool);
}
2021-06-02 19:44:36 +00:00
| MEMORYADDRESS
{
$$ = MakePrimitiveTypeNode(MemoryAddress);
}
2021-06-07 18:51:33 +00:00
| Identifier GenericArgumentClauseNonEmpty
{
$$ = MakeConcreteGenericTypeNode($1, $2);
}
2021-04-24 19:59:30 +00:00
| Identifier
{
2021-06-07 18:51:33 +00:00
$$ = MakeCustomTypeNode($1);
2021-04-24 19:59:30 +00:00
}
| REFERENCE LESS_THAN Type GREATER_THAN
{
$$ = MakeReferenceTypeNode($3);
2021-04-18 20:14:50 +00:00
}
;
2021-04-24 19:59:30 +00:00
Type : BaseType
{
$$ = MakeTypeNode($1);
}
2021-04-16 21:40:28 +00:00
Identifier : ID
2021-04-16 07:35:35 +00:00
{
$$ = MakeIdentifierNode(yytext);
}
2021-04-16 21:40:28 +00:00
2021-04-28 19:49:45 +00:00
HeapAllocation : ALLOC Type
{
$$ = MakeAllocNode($2);
}
2021-04-22 04:29:38 +00:00
AccessExpression : Identifier POINT AccessExpression
{
$$ = MakeAccessExpressionNode($1, $3);
}
| Identifier
{
$$ = $1;
}
2021-09-07 06:59:43 +00:00
| BaseType POINT AccessExpression
{
$$ = MakeAccessExpressionNode($1, $3);
}
;
2021-04-22 04:29:38 +00:00
2021-06-02 19:33:01 +00:00
SystemCallExpression : AT Identifier
{
$$ = $2;
}
2021-04-30 06:49:35 +00:00
Number : NUMBER
2021-04-16 07:35:35 +00:00
{
$$ = MakeNumberNode(yytext);
}
2021-04-30 06:49:35 +00:00
2021-06-07 18:51:33 +00:00
FieldInit : Identifier COLON Expression
{
$$ = MakeFieldInitNode($1, $3);
}
StructInitFields : FieldInit
{
$$ = StartStructInitFieldsNode($1);
}
| StructInitFields COMMA FieldInit
{
$$ = AddFieldInitNode($1, $3);
}
|
{
$$ = MakeEmptyFieldInitNode();
}
;
StructInitExpression : Type LEFT_BRACE StructInitFields RIGHT_BRACE
{
$$ = MakeStructInitExpressionNode($1, $3);
}
2021-04-30 06:49:35 +00:00
PrimaryExpression : Number
2021-04-30 19:17:44 +00:00
| STRING_LITERAL
2021-04-16 07:35:35 +00:00
{
$$ = MakeStringNode(yytext);
}
| LEFT_PAREN Expression RIGHT_PAREN
2021-04-18 20:14:50 +00:00
{
$$ = $2;
}
2021-04-20 17:47:40 +00:00
| FunctionCallExpression
2021-04-22 04:29:38 +00:00
| AccessExpression
2021-06-07 18:51:33 +00:00
| StructInitExpression
2021-04-16 07:35:35 +00:00
;
UnaryExpression : BANG Expression
{
$$ = MakeUnaryNode(Negate, $2);
}
BinaryExpression : Expression PLUS Expression
{
$$ = MakeBinaryNode(Add, $1, $3);
}
| Expression MINUS Expression
{
$$ = MakeBinaryNode(Subtract, $1, $3);
}
2021-04-20 17:47:40 +00:00
| Expression STAR Expression
{
$$ = MakeBinaryNode(Multiply, $1, $3);
}
2021-04-30 06:49:35 +00:00
| Expression PERCENT Expression
{
$$ = MakeBinaryNode(Mod, $1, $3);
}
2021-04-29 04:25:25 +00:00
| Expression LESS_THAN Expression
{
$$ = MakeBinaryNode(LessThan, $1, $3);
}
2021-04-29 22:26:30 +00:00
| Expression GREATER_THAN Expression
{
$$ = MakeBinaryNode(GreaterThan, $1, $3);
}
2021-04-30 06:49:35 +00:00
| Expression EQUAL EQUAL Expression
{
$$ = MakeBinaryNode(Equal, $1, $4);
}
| Expression BAR BAR Expression
{
$$ = MakeBinaryNode(LogicalOr, $1, $4);
}
2021-04-16 07:35:35 +00:00
2021-04-29 22:26:30 +00:00
Expression : BinaryExpression
2021-04-16 07:35:35 +00:00
| UnaryExpression
2021-04-29 22:26:30 +00:00
| PrimaryExpression
2021-04-28 19:49:45 +00:00
| HeapAllocation
2021-04-16 07:35:35 +00:00
;
2021-04-16 21:40:28 +00:00
2021-04-23 04:16:37 +00:00
VariableDeclaration : Identifier COLON Type
2021-04-18 20:14:50 +00:00
{
2021-04-23 04:16:37 +00:00
$$ = MakeDeclarationNode($3, $1);
2021-04-18 20:14:50 +00:00
}
AssignmentStatement : VariableDeclaration EQUAL Expression
2021-04-22 04:29:38 +00:00
{
$$ = MakeAssignmentNode($1, $3);
}
| AccessExpression EQUAL Expression
2021-04-18 20:14:50 +00:00
{
$$ = MakeAssignmentNode($1, $3);
}
| Identifier EQUAL Expression
2021-04-16 21:40:28 +00:00
{
2021-04-18 20:14:50 +00:00
$$ = MakeAssignmentNode($1, $3);
2021-04-16 21:40:28 +00:00
}
2021-04-18 20:14:50 +00:00
2021-04-18 20:30:50 +00:00
ReturnStatement : RETURN Expression
{
$$ = MakeReturnStatementNode($2);
}
2021-04-21 02:00:18 +00:00
| RETURN
{
$$ = MakeReturnVoidStatementNode();
}
2021-04-18 20:30:50 +00:00
2021-06-02 21:33:15 +00:00
FunctionCallExpression : AccessExpression GenericArgumentClause LEFT_PAREN Arguments RIGHT_PAREN
2021-04-20 17:47:40 +00:00
{
2021-06-02 21:33:15 +00:00
$$ = MakeFunctionCallExpressionNode($1, $4, $2);
2021-04-20 17:47:40 +00:00
}
2021-06-02 21:33:15 +00:00
| SystemCallExpression GenericArgumentClause LEFT_PAREN Arguments RIGHT_PAREN
2021-06-02 19:33:01 +00:00
{
2021-06-02 21:33:15 +00:00
$$ = MakeSystemCallExpressionNode($1, $4, $2);
2021-06-02 19:33:01 +00:00
}
2021-04-20 17:47:40 +00:00
2021-04-23 00:19:35 +00:00
PartialStatement : FunctionCallExpression
| AssignmentStatement
2021-04-18 20:14:50 +00:00
| VariableDeclaration
2021-04-18 20:30:50 +00:00
| ReturnStatement
2021-04-18 20:14:50 +00:00
;
2021-04-29 04:25:25 +00:00
IfStatement : IF LEFT_PAREN Expression RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE
{
2021-04-29 19:42:51 +00:00
$$ = MakeIfNode($3, $6);
}
2021-04-29 04:25:25 +00:00
2021-04-29 19:42:51 +00:00
Conditional : IfStatement
| IfStatement ELSE LEFT_BRACE Statements RIGHT_BRACE
{
$$ = MakeIfElseNode($1, $4);
2021-04-29 04:25:25 +00:00
}
2021-04-29 22:26:30 +00:00
| IfStatement ELSE Conditional
{
$$ = MakeIfElseNode($1, $3);
}
2021-04-29 04:25:25 +00:00
2021-04-30 07:50:35 +00:00
ForStatement : FOR LEFT_PAREN VariableDeclaration IN LEFT_BRACKET Number POINT POINT Number RIGHT_BRACKET RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE
2021-04-30 06:49:35 +00:00
{
$$ = MakeForLoopNode($3, $6, $9, $13);
}
2021-04-29 04:25:25 +00:00
Statement : PartialStatement SEMICOLON
2021-04-29 19:42:51 +00:00
| Conditional
2021-04-30 06:49:35 +00:00
| ForStatement
2021-04-29 04:25:25 +00:00
;
2021-04-18 20:14:50 +00:00
2021-04-29 19:42:51 +00:00
Statements : Statement
2021-04-16 21:40:28 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = StartStatementSequenceNode($1);
2021-04-16 21:40:28 +00:00
}
2021-04-29 19:42:51 +00:00
| Statements Statement
2021-04-16 21:40:28 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = AddStatement($1, $2);
2021-04-16 21:40:28 +00:00
}
2021-04-18 20:14:50 +00:00
2021-06-07 18:51:33 +00:00
Arguments : Expression
2021-04-20 17:47:40 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = StartFunctionArgumentSequenceNode($1);
2021-04-20 17:47:40 +00:00
}
2021-06-07 18:51:33 +00:00
| Arguments COMMA Expression
2021-04-20 17:47:40 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = AddFunctionArgumentNode($1, $3);
2021-04-20 17:47:40 +00:00
}
|
2021-04-23 00:19:35 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = MakeEmptyFunctionArgumentSequenceNode();
2021-04-23 00:19:35 +00:00
}
2021-04-20 17:47:40 +00:00
2021-04-29 19:42:51 +00:00
SignatureArguments : VariableDeclaration
2021-04-20 01:18:45 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = StartFunctionSignatureArgumentsNode($1);
2021-04-20 01:18:45 +00:00
}
2021-04-29 19:42:51 +00:00
| SignatureArguments COMMA VariableDeclaration
2021-04-20 01:18:45 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = AddFunctionSignatureArgumentNode($1, $3);
2021-04-20 01:18:45 +00:00
}
2021-04-20 17:47:40 +00:00
|
2021-04-29 19:42:51 +00:00
{
$$ = MakeEmptyFunctionSignatureArgumentsNode();
}
2021-04-20 17:47:40 +00:00
;
2021-04-18 20:14:50 +00:00
Body : LEFT_BRACE Statements RIGHT_BRACE
2021-04-16 21:40:28 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = $2;
2021-04-16 21:40:28 +00:00
}
2021-04-18 20:14:50 +00:00
2021-06-02 21:33:15 +00:00
GenericDeclaration : Identifier
2021-04-16 21:40:28 +00:00
{
2021-06-02 21:33:15 +00:00
$$ = MakeGenericDeclarationNode($1, NULL);
2021-04-22 07:35:42 +00:00
}
2021-06-07 19:52:57 +00:00
| Identifier COLON Type
{
$$ = MakeGenericDeclarationNode($1, $3);
}
2021-06-01 19:58:46 +00:00
2021-06-02 21:33:15 +00:00
GenericDeclarations : GenericDeclaration
{
$$ = StartGenericDeclarationsNode($1);
}
| GenericDeclarations COMMA GenericDeclaration
{
$$ = AddGenericDeclaration($1, $3);
}
GenericDeclarationClause : LESS_THAN GenericDeclarations GREATER_THAN
{
$$ = $2;
}
|
{
$$ = MakeEmptyGenericDeclarationsNode();
}
2021-06-03 00:26:26 +00:00
GenericArgument : Type
{
$$ = MakeGenericArgumentNode($1);
}
2021-06-02 21:33:15 +00:00
2021-06-01 19:58:46 +00:00
GenericArguments : GenericArgument
{
$$ = StartGenericArgumentsNode($1);
}
| GenericArguments COMMA GenericArgument
{
$$ = AddGenericArgument($1, $3);
}
2021-06-07 18:51:33 +00:00
GenericArgumentClauseNonEmpty : LESS_THAN GenericArguments GREATER_THAN
{
$$ = $2;
}
;
2021-06-02 21:33:15 +00:00
2021-06-07 18:51:33 +00:00
GenericArgumentClause : GenericArgumentClauseNonEmpty
2021-06-01 19:58:46 +00:00
|
{
$$ = MakeEmptyGenericArgumentsNode();
}
2021-06-02 21:33:15 +00:00
FunctionSignature : Identifier GenericDeclarationClause LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type
2021-06-01 19:58:46 +00:00
{
$$ = MakeFunctionSignatureNode($1, $7, $4, MakeFunctionModifiersNode(NULL, 0), $2);
}
2021-06-02 21:33:15 +00:00
| STATIC Identifier GenericDeclarationClause LEFT_PAREN SignatureArguments RIGHT_PAREN COLON Type
2021-04-22 07:35:42 +00:00
{
Node *modifier = MakeStaticNode();
2021-06-01 19:58:46 +00:00
$$ = MakeFunctionSignatureNode($2, $8, $5, MakeFunctionModifiersNode(&modifier, 1), $3);
2021-04-16 21:40:28 +00:00
}
2021-04-18 20:14:50 +00:00
FunctionDeclaration : FunctionSignature Body
2021-04-16 21:40:28 +00:00
{
2021-04-18 20:14:50 +00:00
$$ = MakeFunctionDeclarationNode($1, $2);
2021-04-16 21:40:28 +00:00
}
2021-06-02 21:33:15 +00:00
StructDeclaration : STRUCT Identifier GenericDeclarationClause LEFT_BRACE Declarations RIGHT_BRACE
2021-04-18 20:14:50 +00:00
{
2021-06-02 21:33:15 +00:00
$$ = MakeStructDeclarationNode($2, $5, $3);
2021-04-18 20:14:50 +00:00
}
2021-04-21 02:00:18 +00:00
Declaration : FunctionDeclaration
| VariableDeclaration SEMICOLON
2021-04-18 20:14:50 +00:00
;
2021-04-29 19:42:51 +00:00
Declarations : Declaration
2021-04-16 21:40:28 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = StartDeclarationSequenceNode($1);
2021-04-16 21:40:28 +00:00
}
2021-04-29 19:42:51 +00:00
| Declarations Declaration
2021-04-16 21:40:28 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = AddDeclarationNode($1, $2);
2021-04-16 21:40:28 +00:00
}
2021-04-21 02:00:18 +00:00
2021-06-07 19:52:57 +00:00
InterfaceMember : FunctionSignature SEMICOLON
{
$$ = $1;
}
InterfaceMembers : InterfaceMember
{
$$ = StartInterfaceMembersNode($1);
}
| InterfaceMembers InterfaceMember
{
$$ = AddInterfaceMemberNode($1, $2);
}
2021-09-07 06:59:43 +00:00
InterfaceDeclaration : INTERFACE Identifier GenericDeclarationClause LEFT_BRACE InterfaceMembers RIGHT_BRACE
2021-06-07 19:52:57 +00:00
{
2021-09-07 06:59:43 +00:00
$$ = MakeInterfaceDeclarationNode($2, $5, $3);
2021-06-07 19:52:57 +00:00
}
TopLevelDeclaration : StructDeclaration
| InterfaceDeclaration
;
2021-04-21 02:00:18 +00:00
2021-04-29 19:42:51 +00:00
TopLevelDeclarations : TopLevelDeclaration
2021-04-21 02:00:18 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = StartDeclarationSequenceNode($1);
2021-04-21 02:00:18 +00:00
}
2021-04-29 19:42:51 +00:00
| TopLevelDeclarations TopLevelDeclaration
2021-04-21 02:00:18 +00:00
{
2021-04-29 19:42:51 +00:00
$$ = AddDeclarationNode($1, $2);
2021-04-21 02:00:18 +00:00
}
2021-04-16 07:35:35 +00:00
%%