Trace the source code position in the lexer
This commit is contained in:
@ -9,7 +9,7 @@ from Storage import ALLOCATE, REALLOCATE;
|
||||
from Lexer import Lexer, LexerKind, LexerToken, lexer_current, lexer_lex;
|
||||
|
||||
(* Calls lexer_lex() but skips the comments. *)
|
||||
proc transpiler_lex(lexer: PLexer) -> LexerToken;
|
||||
proc parser_lex(lexer: PLexer) -> LexerToken;
|
||||
var
|
||||
result: LexerToken;
|
||||
begin
|
||||
@ -30,7 +30,7 @@ var
|
||||
current_field: PAstFieldDeclaration;
|
||||
begin
|
||||
ALLOCATE(field_declarations, TSIZE(AstFieldDeclaration));
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
field_count := 0;
|
||||
|
||||
while token.kind <> lexerKindEnd do
|
||||
@ -41,16 +41,16 @@ begin
|
||||
current_field := field_declarations;
|
||||
INC(current_field , TSIZE(AstFieldDeclaration) * (field_count - 1));
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
current_field^.field_name := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
current_field^.field_type := parse_type_expression(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
if token.kind = lexerKindSemicolon then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
INC(current_field, TSIZE(AstFieldDeclaration));
|
||||
@ -81,7 +81,7 @@ begin
|
||||
token := lexer_current(lexer);
|
||||
|
||||
if token.kind = lexerKindPointer then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
token := lexer_current(lexer);
|
||||
result^.target := parse_type_expression(lexer);
|
||||
@ -102,16 +102,16 @@ begin
|
||||
token := lexer_current(lexer);
|
||||
|
||||
if token.kind = lexerKindArray then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
if token.kind <> lexerKindOf then
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
result^.length := token.integerKind;
|
||||
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.base := parse_type_expression(lexer);
|
||||
|
||||
return result
|
||||
@ -129,14 +129,14 @@ begin
|
||||
|
||||
case_count := 1;
|
||||
ALLOCATE(result^.cases, TSIZE(Identifier) * 2);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
current_case := result^.cases;
|
||||
current_case^ := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
while token.kind = lexerKindComma do
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
INC(case_count);
|
||||
INC(case_count);
|
||||
@ -146,7 +146,7 @@ begin
|
||||
INC(current_case, TSIZE(Identifier) * (case_count - 1));
|
||||
current_case^ := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
INC(current_case, TSIZE(Identifier));
|
||||
MemZero(current_case, TSIZE(Identifier));
|
||||
@ -181,8 +181,8 @@ begin
|
||||
|
||||
ALLOCATE(result^.parameters, 1);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
while token.kind <> lexerKindRightParen do
|
||||
INC(parameter_count);
|
||||
@ -194,9 +194,9 @@ begin
|
||||
|
||||
current_parameter^ := parse_type_expression(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
if token.kind = lexerKindComma then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
current_parameter := result^.parameters;
|
||||
@ -245,11 +245,11 @@ begin
|
||||
NEW(result);
|
||||
result^.identifier := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
result^.type_expression := parse_type_expression(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return result
|
||||
end;
|
||||
@ -268,7 +268,7 @@ begin
|
||||
declaration_count := 0;
|
||||
|
||||
if token.kind = lexerKindType then
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
while token.kind = lexerKindIdentifier do
|
||||
INC(declaration_count);
|
||||
@ -278,7 +278,7 @@ begin
|
||||
INC(current_declaration, TSIZE(PAstTypedDeclaration) * (declaration_count - 1));
|
||||
|
||||
current_declaration^ := parse_type_declaration(lexer);
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
if declaration_count <> 0 then
|
||||
@ -299,12 +299,12 @@ begin
|
||||
token := lexer_current(lexer);
|
||||
result^.variable_name := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.variable_type := parse_type_expression(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
return result
|
||||
end;
|
||||
|
||||
@ -322,7 +322,7 @@ begin
|
||||
declaration_count := 0;
|
||||
|
||||
if token.kind = lexerKindVar then
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
while token.kind = lexerKindIdentifier do
|
||||
INC(declaration_count);
|
||||
@ -332,7 +332,7 @@ begin
|
||||
INC(current_declaration, TSIZE(PAstVariableDeclaration) * (declaration_count - 1));
|
||||
|
||||
current_declaration^ := parse_variable_declaration(lexer);
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
if declaration_count <> 0 then
|
||||
@ -353,12 +353,12 @@ begin
|
||||
token := lexer_current(lexer);
|
||||
result^.constant_name := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.constant_value := token.integerKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return result
|
||||
end;
|
||||
@ -377,7 +377,7 @@ begin
|
||||
declaration_count := 0;
|
||||
|
||||
if token.kind = lexerKindConst then
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
while token.kind = lexerKindIdentifier do
|
||||
INC(declaration_count);
|
||||
@ -387,7 +387,7 @@ begin
|
||||
INC(current_declaration, TSIZE(PAstConstantDeclaration) * (declaration_count - 1));
|
||||
|
||||
current_declaration^ := parse_constant_declaration(lexer);
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
if declaration_count <> 0 then
|
||||
@ -408,20 +408,20 @@ begin
|
||||
NEW(result);
|
||||
symbol_count := 1;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.package := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
ALLOCATE(result^.symbols, TSIZE(Identifier) * 2);
|
||||
|
||||
current_symbol := result^.symbols;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
current_symbol^ := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
while token.kind <> lexerKindSemicolon do
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
INC(symbol_count);
|
||||
|
||||
REALLOCATE(result^.symbols, TSIZE(Identifier) * (symbol_count + 1));
|
||||
@ -429,12 +429,12 @@ begin
|
||||
INC(current_symbol, TSIZE(Identifier) * (symbol_count - 1));
|
||||
|
||||
current_symbol^ := token.identifierKind;
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
INC(current_symbol, TSIZE(Identifier));
|
||||
MemZero(current_symbol, TSIZE(Identifier));
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return result
|
||||
end;
|
||||
@ -501,7 +501,7 @@ begin
|
||||
literal^.boolean := token.booleanKind
|
||||
end;
|
||||
if literal <> nil then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
|
||||
return literal
|
||||
@ -526,7 +526,7 @@ begin
|
||||
end;
|
||||
if (result = nil) & (next_token.kind = lexerKindMinus) then
|
||||
NEW(result);
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
result^.kind := astExpressionKindUnary;
|
||||
result^.unary_operator := astUnaryOperatorMinus;
|
||||
@ -534,17 +534,17 @@ begin
|
||||
end;
|
||||
if (result = nil) & (next_token.kind = lexerKindTilde) then
|
||||
NEW(result);
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
result^.kind := astExpressionKindUnary;
|
||||
result^.unary_operator := astUnaryOperatorNot;
|
||||
result^.unary_operand := parse_factor(lexer)
|
||||
end;
|
||||
if (result = nil) & (next_token.kind = lexerKindLeftParen) then
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
result := parse_expression(lexer);
|
||||
if result <> nil then
|
||||
next_token := transpiler_lex(lexer)
|
||||
next_token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
if (result = nil) & (next_token.kind = lexerKindIdentifier) then
|
||||
@ -553,7 +553,7 @@ begin
|
||||
result^.kind := astExpressionKindIdentifier;
|
||||
result^.identifier := next_token.identifierKind;
|
||||
|
||||
next_token := transpiler_lex(lexer)
|
||||
next_token := parser_lex(lexer)
|
||||
end;
|
||||
|
||||
return result
|
||||
@ -581,34 +581,34 @@ begin
|
||||
designator^.kind := astExpressionKindDereference;
|
||||
designator^.reference := inner_expression;
|
||||
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
handled := true
|
||||
end;
|
||||
if ~handled & (next_token.kind = lexerKindLeftSquare) then
|
||||
NEW(designator);
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
designator^.kind := astExpressionKindArrayAccess;
|
||||
designator^.array := inner_expression;
|
||||
designator^.index := parse_expression(lexer);
|
||||
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
handled := true
|
||||
end;
|
||||
if ~handled & (next_token.kind = lexerKindDot) then
|
||||
NEW(designator);
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
designator^.kind := astExpressionKindFieldAccess;
|
||||
designator^.aggregate := inner_expression;
|
||||
designator^.field := next_token.identifierKind;
|
||||
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
handled := true
|
||||
end;
|
||||
if ~handled & (next_token.kind = lexerKindLeftParen) then
|
||||
NEW(designator);
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
designator^.kind := astExpressionKindCall;
|
||||
designator^.callable := inner_expression;
|
||||
@ -623,7 +623,7 @@ begin
|
||||
next_token := lexer_current(lexer);
|
||||
|
||||
while next_token.kind = lexerKindComma do
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
|
||||
designator^.argument_count := designator^.argument_count + 1;
|
||||
REALLOCATE(designator^.arguments, TSIZE(PAstExpression) * designator^.argument_count);
|
||||
@ -635,7 +635,7 @@ begin
|
||||
end
|
||||
end;
|
||||
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
handled := true
|
||||
end
|
||||
end;
|
||||
@ -649,7 +649,7 @@ var
|
||||
result: PAstExpression;
|
||||
right: PAstExpression;
|
||||
begin
|
||||
next_token := transpiler_lex(lexer);
|
||||
next_token := parser_lex(lexer);
|
||||
right := parse_designator(lexer);
|
||||
result := nil;
|
||||
|
||||
@ -725,7 +725,7 @@ begin
|
||||
NEW(result);
|
||||
result^.kind := astStatementKindReturn;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.returned := parse_expression(lexer);
|
||||
|
||||
return result
|
||||
@ -740,7 +740,7 @@ begin
|
||||
result^.kind := astStatementKindAssignment;
|
||||
result^.assignee := assignee;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.assignment := parse_expression(lexer);
|
||||
|
||||
return result
|
||||
@ -792,7 +792,7 @@ var
|
||||
designator: PAstExpression;
|
||||
begin
|
||||
statement := nil;
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
if token.kind = lexerKindIf then
|
||||
statement := parse_if_statement(lexer)
|
||||
@ -825,11 +825,11 @@ begin
|
||||
NEW(result);
|
||||
result^.kind := astStatementKindIf;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.if_condition := parse_expression(lexer);
|
||||
result^.if_branch := parse_compound_statement(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
return result
|
||||
end;
|
||||
|
||||
@ -841,11 +841,11 @@ begin
|
||||
NEW(result);
|
||||
result^.kind := astStatementKindWhile;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.while_condition := parse_expression(lexer);
|
||||
result^.while_body := parse_compound_statement(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
return result
|
||||
end;
|
||||
|
||||
@ -874,15 +874,15 @@ var
|
||||
begin
|
||||
NEW(declaration);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
declaration^.name := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
declaration^.parameters := nil;
|
||||
declaration^.parameter_count := 0;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
while token.kind <> lexerKindRightParen do
|
||||
parameter_index := declaration^.parameter_count;
|
||||
INC(declaration^.parameter_count);
|
||||
@ -893,26 +893,26 @@ begin
|
||||
|
||||
current_parameter^.identifier := token.identifierKind;
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
current_parameter^.type_expression := parse_type_expression(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
if token.kind = lexerKindComma then
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end
|
||||
end;
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
declaration^.return_type := nil;
|
||||
|
||||
(* Check for the return type and write it. *)
|
||||
if token.kind = lexerKindArrow then
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
declaration^.return_type := parse_type_expression(lexer);
|
||||
token := transpiler_lex(lexer)
|
||||
token := parser_lex(lexer)
|
||||
end;
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return declaration
|
||||
end;
|
||||
@ -928,8 +928,8 @@ begin
|
||||
declaration^.variables := parse_variable_part(lexer);
|
||||
declaration^.statements := parse_statement_part(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return declaration
|
||||
end;
|
||||
@ -971,16 +971,16 @@ var
|
||||
result: PAstModule;
|
||||
begin
|
||||
NEW(result);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
result^.main := true;
|
||||
|
||||
if token.kind = lexerKindModule then
|
||||
result^.main := false
|
||||
end;
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
(* Write the module body. *)
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
result^.imports := parse_import_part(lexer);
|
||||
result^.constants := parse_constant_part(lexer);
|
||||
@ -990,8 +990,8 @@ begin
|
||||
result^.procedures := parse_procedure_part(lexer);
|
||||
result^.statements := parse_statement_part(lexer);
|
||||
|
||||
token := transpiler_lex(lexer);
|
||||
token := transpiler_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
token := parser_lex(lexer);
|
||||
|
||||
return result
|
||||
end;
|
||||
|
Reference in New Issue
Block a user