summaryrefslogtreecommitdiff
path: root/source/Parser.def
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-12-02 10:22:06 +0100
committerEugen Wissner <belka@caraus.de>2025-12-02 17:14:18 +0100
commit23b6f074c7f560d701e9a1fa5713a965af3a18a3 (patch)
tree87549a4eba3da8d8ed6e3fbb2e337e152a8bc96a /source/Parser.def
parent5f7d83974114c73327ce9fff3635927df050b5e4 (diff)
downloadelna-23b6f074c7f560d701e9a1fa5713a965af3a18a3.tar.gz
Merge GCC frontend into the branch
Diffstat (limited to 'source/Parser.def')
-rw-r--r--source/Parser.def200
1 files changed, 200 insertions, 0 deletions
diff --git a/source/Parser.def b/source/Parser.def
new file mode 100644
index 0000000..a766e8e
--- /dev/null
+++ b/source/Parser.def
@@ -0,0 +1,200 @@
+DEFINITION MODULE Parser;
+
+FROM Common IMPORT Identifier, PIdentifier, ShortString;
+FROM Lexer IMPORT PLexer;
+
+TYPE
+ Parser = RECORD
+ lexer: PLexer
+ END;
+ PParser = POINTER TO Parser;
+
+ AstLiteralKind = (
+ astLiteralKindInteger,
+ astLiteralKindString,
+ astLiteralKindNull,
+ astLiteralKindBoolean
+ );
+ AstLiteral = RECORD
+ CASE kind: AstLiteralKind OF
+ astLiteralKindInteger: integer: INTEGER |
+ astLiteralKindString: string: ShortString |
+ astLiteralKindNull: |
+ astLiteralKindBoolean: boolean: BOOLEAN
+ END
+ END;
+ PAstLiteral = POINTER TO AstLiteral;
+
+ AstUnaryOperator = (
+ astUnaryOperatorReference,
+ astUnaryOperatorNot,
+ astUnaryOperatorMinus
+ );
+ AstBinaryOperator = (
+ astBinaryOperatorSum,
+ astBinaryOperatorSubtraction,
+ astBinaryOperatorMultiplication,
+ astBinaryOperatorDivision,
+ astBinaryOperatorRemainder,
+ astBinaryOperatorEquals,
+ astBinaryOperatorNotEquals,
+ astBinaryOperatorLess,
+ astBinaryOperatorGreater,
+ astBinaryOperatorLessEqual,
+ astBinaryOperatorGreaterEqual,
+ astBinaryOperatorDisjunction,
+ astBinaryOperatorConjunction,
+ astBinaryOperatorExclusiveDisjunction,
+ astBinaryOperatorShiftLeft,
+ astBinaryOperatorShiftRight
+ );
+
+ AstExpressionKind = (
+ astExpressionKindLiteral,
+ astExpressionKindIdentifier,
+ astExpressionKindArrayAccess,
+ astExpressionKindDereference,
+ astExpressionKindFieldAccess,
+ astExpressionKindUnary,
+ astExpressionKindBinary,
+ astExpressionKindCall
+ );
+ AstExpression = RECORD
+ CASE kind: AstExpressionKind OF
+ astExpressionKindLiteral: literal: PAstLiteral |
+ astExpressionKindIdentifier: identifier: Identifier |
+ astExpressionKindDereference: reference: PAstExpression |
+ astExpressionKindArrayAccess:
+ array: PAstExpression;
+ index: PAstExpression |
+ astExpressionKindFieldAccess:
+ aggregate: PAstExpression;
+ field: Identifier |
+ astExpressionKindUnary:
+ unary_operator: AstUnaryOperator;
+ unary_operand: PAstExpression |
+ astExpressionKindBinary:
+ binary_operator: AstBinaryOperator;
+ lhs: PAstExpression;
+ rhs: PAstExpression |
+ astExpressionKindCall:
+ callable: PAstExpression;
+ argument_count: CARDINAL;
+ arguments: PPAstExpression
+ END
+ END;
+ PAstExpression = POINTER TO AstExpression;
+ PPAstExpression = POINTER TO PAstExpression;
+
+ AstStatementKind = (
+ astStatementKindIf,
+ astStatementKindWhile,
+ astStatementKindAssignment,
+ astStatementKindReturn,
+ astStatementKindCall
+ );
+ AstStatement = RECORD
+ CASE kind: AstStatementKind OF
+ astStatementKindIf:
+ if_condition: PAstExpression;
+ if_branch: AstCompoundStatement |
+ astStatementKindWhile:
+ while_condition: PAstExpression;
+ while_body: AstCompoundStatement |
+ astStatementKindAssignment:
+ assignee: PAstExpression;
+ assignment: PAstExpression |
+ astStatementKindReturn: returned: PAstExpression |
+ astStatementKindCall: call: PAstExpression
+ END
+ END;
+ PAstStatement = POINTER TO AstStatement;
+ PPAstStatement = POINTER TO PAstStatement;
+ AstCompoundStatement = RECORD
+ count: CARDINAL;
+ statements: PPAstStatement
+ END;
+
+ AstImportStatement = RECORD
+ package: Identifier;
+ symbols: PIdentifier
+ END;
+ PAstImportStatement = POINTER TO AstImportStatement;
+ PPAstImportStatement = POINTER TO PAstImportStatement;
+
+ AstConstantDeclaration = RECORD
+ constant_name: Identifier;
+ constant_value: INTEGER
+ END;
+ PAstConstantDeclaration = POINTER TO AstConstantDeclaration;
+ PPAstConstantDeclaration = POINTER TO PAstConstantDeclaration;
+
+ AstFieldDeclaration = RECORD
+ field_name: Identifier;
+ field_type: PAstTypeExpression
+ END;
+ PAstFieldDeclaration = POINTER TO AstFieldDeclaration;
+
+ AstTypeExpressionKind = (
+ astTypeExpressionKindNamed,
+ astTypeExpressionKindRecord,
+ astTypeExpressionKindEnumeration,
+ astTypeExpressionKindArray,
+ astTypeExpressionKindPointer,
+ astTypeExpressionKindProcedure
+ );
+ AstTypeExpression = RECORD
+ CASE kind: AstTypeExpressionKind OF
+ astTypeExpressionKindNamed: name: Identifier |
+ astTypeExpressionKindEnumeration: cases: PIdentifier |
+ astTypeExpressionKindPointer: target: PAstTypeExpression |
+ astTypeExpressionKindRecord: fields: PAstFieldDeclaration |
+ astTypeExpressionKindArray:
+ base: PAstTypeExpression;
+ length: CARDINAL |
+ astTypeExpressionKindProcedure: parameters: PPAstTypeExpression
+ END
+ END;
+ PAstTypeExpression = POINTER TO AstTypeExpression;
+ PPAstTypeExpression = POINTER TO PAstTypeExpression;
+
+ AstTypedDeclaration = RECORD
+ identifier: Identifier;
+ type_expression: PAstTypeExpression
+ END;
+ PAstTypedDeclaration = POINTER TO AstTypedDeclaration;
+ PPAstTypedDeclaration = POINTER TO PAstTypedDeclaration;
+
+ AstVariableDeclaration = RECORD
+ variable_name: Identifier;
+ variable_type: PAstTypeExpression
+ END;
+ PAstVariableDeclaration = POINTER TO AstVariableDeclaration;
+ PPAstVariableDeclaration = POINTER TO PAstVariableDeclaration;
+
+ AstProcedureDeclaration = RECORD
+ name: Identifier;
+ parameter_count: CARDINAL;
+ parameters: PAstTypedDeclaration;
+ return_type: PAstTypeExpression;
+ constants: PPAstConstantDeclaration;
+ variables: PPAstVariableDeclaration;
+ statements: AstCompoundStatement
+ END;
+ PAstProcedureDeclaration = POINTER TO AstProcedureDeclaration;
+ PPAstProcedureDeclaration = POINTER TO PAstProcedureDeclaration;
+
+ AstModule = RECORD
+ main: BOOLEAN;
+ imports: PPAstImportStatement;
+ constants: PPAstConstantDeclaration;
+ types: PPAstTypedDeclaration;
+ variables: PPAstVariableDeclaration;
+ procedures: PPAstProcedureDeclaration;
+ statements: AstCompoundStatement
+ END;
+ PAstModule = POINTER TO AstModule;
+
+PROCEDURE parse(lexer: PLexer): PAstModule;
+
+END Parser.