Похоже, что игра окончена. Вы тут обсуждали какие-то титанические изменения, а я-то понимал, насколько мало ресурсов.
Всё, что я успел - это научиться добавлять константу с именем исходника в модуль, которое работает только при компиляции командой Compiler.Compile, но не при компиляции из PET.
В объектный и символьный файл добавляется вот такая константа:
Код:
__dEfInEdInThEFilE__* = \"C:/ob/A2OS/Source/PET.Mod"\;
Исходник - тут:
https://github.com/budden/ch115Различие - вот:
Код:
source/FoxParser.Mod | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/source/FoxParser.Mod b/source/FoxParser.Mod
index b4302bc7c..78c7a1862 100644
--- a/source/FoxParser.Mod
+++ b/source/FoxParser.Mod
@@ -2273,6 +2273,22 @@ TYPE
IF Trace THEN E( "TypeDeclaration" ) END;
END TypeDeclaration;
+ (** Compiler-generated constant *)
+ PROCEDURE GenerateStringConstantDeclaration*(parentScope: SyntaxTree.Scope
+ ; name: SyntaxTree.Identifier
+ ; position: Position
+ ; value: Scanner.StringType );
+ VAR constant: SyntaxTree.Constant;
+ BEGIN
+ IF Trace THEN S( "GenerateStringConstantDeclaration" ) END;
+ constant := SyntaxTree.NewConstant( position, name );
+ constant.SetAccess(SyntaxTree.Public + SyntaxTree.Protected + SyntaxTree.Internal);
+ constant.SetValue(SyntaxTree.NewStringValue( position, value ));
+ parentScope.AddConstant( constant );
+
+ IF Trace THEN E( "GenerateStringConstantDeclaration" ) END;
+ END GenerateStringConstantDeclaration;
+
(** ConstDeclaration = IdentifierDefinition '=' Expression. **)
PROCEDURE ConstDeclaration(parentScope: SyntaxTree.Scope );
VAR name: SyntaxTree.Identifier; position: Position; constant: SyntaxTree.Constant; expression: SyntaxTree.Expression; access: SET;
@@ -2387,8 +2403,11 @@ TYPE
**)
PROCEDURE Module*(): SyntaxTree.Module;
- VAR moduleName, context: SyntaxTree.Identifier; module: SyntaxTree.Module; position: Position; isCellNet: BOOLEAN;
+ VAR moduleName, context: SyntaxTree.Identifier;
+ sourceFileNameConstName: SyntaxTree.Identifier;
+ module: SyntaxTree.Module; position: Position; isCellNet: BOOLEAN;
scannerDiagnostics: Diagnostics.Diagnostics; modifiers: SyntaxTree.Modifier; (* c: SyntaxTree.Comment; *)
+
BEGIN
IF Trace THEN S( "Module" ) END;
position := token.position;
@@ -2425,6 +2444,13 @@ TYPE
WHILE Optional(Scanner.Import) DO ImportList(moduleScope) END;
DeclarationSequence( moduleScope);
+
+ StringPool.GetIndex("__dEfInEdInThEFilE__", sourceFileNameConstName);
+ GenerateStringConstantDeclaration(currentScope
+ , sourceFileNameConstName
+ , position
+ , scanner.source);
+
IF Peek(Scanner.Begin) OR Peek(Scanner.Code) THEN
moduleScope.SetBodyProcedure(BodyProcedure(moduleScope)); (* insert empty body procedure if necessary *)
END;
Больше всего меня бесят пока что две вещи - это сложность сборки (вместо подачи одной команды нужно проделать эн манипуляций мышью), её хрупкость (это можно было бы решив, продублировав компилятор) и строки. Это всё можно было бы решить, если бы было на это время. Ну и со шрифтами какой-то ад. Шрифт Оберон мне не нравится, а сделать иной шрифт по умолчанию
мне не удалось - там явно что-то не в порядке с кодом чтения-записи модулей. Я поставил курьер и всё вроде бы работало, но в самый неудачный момент, когда надо было собирать систему, сломался этот вот CompileCommand.Tool . Пришлось вернуться к шрифту Оберон.
По ходу дела переставил конфликтующие Ctrl-Tab и Ctrl-Shift-Tab в PET на Ctrl-7 и Ctrl-Shift-7, на это было потрачено драгоценное время, а зря.
Я придумал костыльный обходной путь для установки шрифта курьер, но на каждое открытие файла приходится несколько раз нажимать мышью, точно попадая в определённые места экрана. Это ад. И, конечно, данный проект достаточно масштабный, чтобы перед его началом избавиться от такого ада. Но не получилось.
От этой константы до решения по поиску определения ещё пахать и пахать, конечно же. Вряд ли у меня есть на это время.