Parse and transpile unary operations

This commit is contained in:
2025-06-06 18:25:53 +02:00
parent 3ca8491f64
commit 8d52410be9
6 changed files with 297 additions and 29 deletions

View File

@ -60,7 +60,7 @@ proc parse_record_type(lexer: PLexer) -> PAstTypeExpression;
var
result: PAstTypeExpression;
begin
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindRecord;
result^.fields := parse_type_fields(lexer);
@ -72,7 +72,7 @@ var
token: LexerToken;
result: PAstTypeExpression;
begin
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindPointer;
token := lexer_current(lexer);
@ -92,7 +92,7 @@ var
buffer: [20]CHAR;
result: PAstTypeExpression;
begin
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindArray;
result^.length := 0;
@ -121,7 +121,7 @@ var
current_case: PIdentifier;
case_count: CARDINAL;
begin
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindEnumeration;
case_count := 1;
@ -153,10 +153,9 @@ proc parse_named_type(lexer: PLexer) -> PAstTypeExpression;
var
token: LexerToken;
result: PAstTypeExpression;
written_bytes: CARDINAL;
begin
token := lexer_current(lexer);
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindNamed;
result^.name := token.identifierKind;
@ -172,7 +171,7 @@ var
parameter_count: CARDINAL;
begin
parameter_count := 0;
ALLOCATE(result, TSIZE(AstTypeExpression));
NEW(result);
result^.kind := astTypeExpressionKindProcedure;
ALLOCATE(result^.parameters, 1);
@ -236,7 +235,7 @@ var
begin
token := lexer_current(lexer);
ALLOCATE(result, TSIZE(AstTypeDeclaration));
NEW(result);
result^.identifier := token.identifierKind;
token := transpiler_lex(lexer);
@ -288,7 +287,7 @@ var
token: LexerToken;
result: PAstVariableDeclaration;
begin
ALLOCATE(result, TSIZE(AstVariableDeclaration));
NEW(result);
token := lexer_current(lexer);
result^.variable_name := token.identifierKind;
@ -342,7 +341,7 @@ var
token: LexerToken;
result: PAstConstantDeclaration;
begin
ALLOCATE(result, TSIZE(AstConstantDeclaration));
NEW(result);
token := lexer_current(lexer);
result^.constant_name := token.identifierKind;
@ -399,7 +398,7 @@ var
symbol_count: CARDINAL;
current_symbol: PIdentifier;
begin
ALLOCATE(result, TSIZE(AstImportStatement));
NEW(result);
symbol_count := 1;
token := transpiler_lex(lexer);
@ -463,4 +462,132 @@ begin
return result
end;
proc parse_literal(lexer: PLexer) -> PAstLiteral;
var
literal: PAstLiteral;
token: LexerToken;
begin
literal := nil;
token := lexer_current(lexer);
if token.kind = lexerKindInteger then
NEW(literal);
literal^.kind := astLiteralKindInteger;
literal^.integer := token.integerKind;
end;
if token.kind = lexerKindCharacter then
NEW(literal);
literal^.kind := astLiteralKindString;
literal^.string := token.stringKind;
end;
if token.kind = lexerKindNull then
NEW(literal);
literal^.kind := astLiteralKindNull;
end;
if literal <> nil then
token := transpiler_lex(lexer)
end;
return literal
end;
proc parse_factor(lexer: PLexer) -> PAstExpression;
var
next_token: LexerToken;
result: PAstExpression;
literal: PAstLiteral;
begin
result := nil;
next_token := lexer_current(lexer);
literal := parse_literal(lexer);
if (result = nil) & (literal <> nil) then
NEW(result);
result^.kind := astExpressionKindLiteral;
result^.literal := literal;
end;
if (result = nil) & (next_token.kind = lexerKindMinus) then
NEW(result);
next_token := transpiler_lex(lexer);
result^.kind := astExpressionKindUnary;
result^.unary_operator := astUnaryOperatorMinus;
result^.unary_operand := parse_factor(lexer)
end;
if (result = nil) & (next_token.kind = lexerKindTilde) then
NEW(result);
next_token := transpiler_lex(lexer);
result^.kind := astExpressionKindUnary;
result^.unary_operator := astUnaryOperatorNot;
result^.unary_operand := parse_factor(lexer)
end;
if (result = nil) & (next_token.kind = lexerKindIdentifier) then
NEW(result);
result^.kind := astExpressionKindIdentifier;
result^.identifier := next_token.identifierKind;
next_token := transpiler_lex(lexer)
end;
return result
end;
proc parse_designator(lexer: PLexer) -> PAstExpression;
var
next_token: LexerToken;
inner_expression: PAstExpression;
designator: PAstExpression;
handled: BOOLEAN;
begin
designator := parse_factor(lexer);
handled := designator <> nil;
next_token := lexer_current(lexer);
while handled do
inner_expression := designator;
handled := false;
if ~handled & (next_token.kind = lexerKindHat) then
NEW(designator);
designator^.kind := astExpressionKindDereference;
designator^.reference := inner_expression;
next_token := transpiler_lex(lexer);
handled := true
end;
if ~handled & (next_token.kind = lexerKindLeftSquare) then
NEW(designator);
next_token := transpiler_lex(lexer);
designator^.kind := astExpressionKindArrayAccess;
designator^.array := inner_expression;
designator^.index := parse_designator(lexer);
next_token := transpiler_lex(lexer);
handled := true
end;
if ~handled & (next_token.kind = lexerKindDot) then
NEW(designator);
next_token := transpiler_lex(lexer);
designator^.kind := astExpressionKindFieldAccess;
designator^.aggregate := inner_expression;
designator^.field := next_token.identifierKind;
next_token := transpiler_lex(lexer);
handled := true
end
end;
return designator
end;
end.