diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-12-02 10:22:06 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-12-02 17:14:18 +0100 |
| commit | 23b6f074c7f560d701e9a1fa5713a965af3a18a3 (patch) | |
| tree | 87549a4eba3da8d8ed6e3fbb2e337e152a8bc96a /source/Parser.def | |
| parent | 5f7d83974114c73327ce9fff3635927df050b5e4 (diff) | |
| download | elna-23b6f074c7f560d701e9a1fa5713a965af3a18a3.tar.gz | |
Merge GCC frontend into the branch
Diffstat (limited to 'source/Parser.def')
| -rw-r--r-- | source/Parser.def | 200 |
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. |
