From bb3bcb1ffdefd5d654b93da14cc2ec7fe59002da Mon Sep 17 00:00:00 2001 From: Mr-Rm Date: Fri, 16 Oct 2026 13:44:45 +0400 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BA=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= =?UTF-8?q?=D0=BC=20=D0=B8=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=B0?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Language/ScriptException.cs | 6 +- .../SyntaxAnalysis/DefaultBslParser.cs | 105 +++++++++++------- .../SyntaxAnalysis/LocalizedErrors.cs | 9 +- 3 files changed, 74 insertions(+), 46 deletions(-) diff --git a/src/OneScript.Language/ScriptException.cs b/src/OneScript.Language/ScriptException.cs index 329285557..f6f3d0179 100644 --- a/src/OneScript.Language/ScriptException.cs +++ b/src/OneScript.Language/ScriptException.cs @@ -104,11 +104,11 @@ public override string Message ColumnNumber = codeLine.Length; } - if (ColumnNumber != ErrorPositionInfo.OUT_OF_TEXT) + if (ColumnNumber > 0) { - sb.Append(codeLine[..ColumnNumber]); + sb.Append(codeLine[..(ColumnNumber - 1)]); sb.Append("<>"); - sb.AppendLine(codeLine[ColumnNumber..]); + sb.AppendLine(codeLine[(ColumnNumber - 1)..]); } else { diff --git a/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs b/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs index 94c19feed..72106eaeb 100644 --- a/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs +++ b/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs @@ -1410,59 +1410,82 @@ private BslSyntaxNode BuildQuestionOperator() } return BuildDereference(node); - } + } + + private bool IsDereferenceable(BslSyntaxNode node) + => node.Kind switch + { + NodeKind.Identifier + or NodeKind.GlobalCall or NodeKind.MethodCall + or NodeKind.DereferenceOperation or NodeKind.IndexAccess + or NodeKind.TernaryOperator + or NodeKind.NewObject // несовместимо с 1С + => true, + + _ => false + }; private BslSyntaxNode BuildDereference(BslSyntaxNode target) { var activeTarget = BuildIndexerAccess(target); - if (_lastExtractedLexem.Token == Token.Dot) + if (_lastExtractedLexem.Token != Token.Dot) + { + return activeTarget; + } + + if (!IsDereferenceable(target)) { - var dotNode = new NonTerminalNode(NodeKind.DereferenceOperation, _lastExtractedLexem); - dotNode.AddChild(activeTarget); - NextLexem(); - if (!LanguageDef.IsValidPropertyName(_lastExtractedLexem)) - { - return CreateError(LocalizedErrors.IdentifierExpected()); - } - - var identifier = _lastExtractedLexem; - NextLexem(); - if (_lastExtractedLexem.Token == Token.OpenPar) - { - var ident = new TerminalNode(NodeKind.Identifier, identifier); - var call = BuildCall(ident, NodeKind.MethodCall); - dotNode.AddChild(call); - } - else - { - _lastDereferenceIsWritable = true; - CreateChild(dotNode, NodeKind.Identifier, identifier); - } - - return BuildDereference(dotNode); - } - - return activeTarget; + AddError(LocalizedErrors.ValueIsNotObjectException()); + } + + var dotNode = new NonTerminalNode(NodeKind.DereferenceOperation, _lastExtractedLexem); + dotNode.AddChild(activeTarget); + NextLexem(); + if (!LanguageDef.IsValidPropertyName(_lastExtractedLexem)) + { + return CreateError(LocalizedErrors.IdentifierExpected()); + } + + var identifier = _lastExtractedLexem; + NextLexem(); + if (_lastExtractedLexem.Token == Token.OpenPar) + { + var ident = new TerminalNode(NodeKind.Identifier, identifier); + var call = BuildCall(ident, NodeKind.MethodCall); + dotNode.AddChild(call); + } + else + { + _lastDereferenceIsWritable = true; + CreateChild(dotNode, NodeKind.Identifier, identifier); + } + + return BuildDereference(dotNode); } private BslSyntaxNode BuildIndexerAccess(BslSyntaxNode target) { - if (_lastExtractedLexem.Token == Token.OpenBracket) + if (_lastExtractedLexem.Token != Token.OpenBracket) + { + return target; + } + + if (!IsDereferenceable(target)) { - var node = new NonTerminalNode(NodeKind.IndexAccess, _lastExtractedLexem); - node.AddChild(target); - NextLexem(); - var expression = BuildExpression(node, Token.CloseBracket); - if (expression.Kind == NodeKind.Unknown) - { - return CreateError(LocalizedErrors.ExpressionSyntax()); - } - NextLexem(); - _lastDereferenceIsWritable = true; - return BuildDereference(node); + AddError(LocalizedErrors.ValueIsNotObjectException()); } - return target; + var node = new NonTerminalNode(NodeKind.IndexAccess, _lastExtractedLexem); + node.AddChild(target); + NextLexem(); + var expression = BuildExpression(node, Token.CloseBracket); + if (expression.Kind == NodeKind.Unknown) + { + return CreateError(LocalizedErrors.ExpressionSyntax()); + } + NextLexem(); + _lastDereferenceIsWritable = true; + return BuildDereference(node); } private BslSyntaxNode BuildNewObjectCreation() diff --git a/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs b/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs index fca4526e5..128b2dd9e 100644 --- a/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs +++ b/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs @@ -164,5 +164,10 @@ public static CodeError SymbolNotFound(string symbol) => public static CodeError AsyncMethodsNotSupported() => Create("Асинхронные методы не поддерживаются", "Async methods aren't supported"); - } -} \ No newline at end of file + + public static CodeError ValueIsNotObjectException() + { + return Create("Значение не является значением объектного типа", "Value is not of object type"); + } + } +} From a311bff6d0f1e182e79f0a3eeee14a17e675a74f Mon Sep 17 00:00:00 2001 From: Mr-Rm Date: Fri, 16 Oct 2026 14:29:26 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20?= =?UTF-8?q?=D1=81=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs b/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs index 72106eaeb..c1e5acdca 100644 --- a/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs +++ b/src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs @@ -1435,7 +1435,7 @@ private BslSyntaxNode BuildDereference(BslSyntaxNode target) if (!IsDereferenceable(target)) { - AddError(LocalizedErrors.ValueIsNotObjectException()); + AddError(LocalizedErrors.ValueIsNotObjectException(), false); } var dotNode = new NonTerminalNode(NodeKind.DereferenceOperation, _lastExtractedLexem); @@ -1472,7 +1472,7 @@ private BslSyntaxNode BuildIndexerAccess(BslSyntaxNode target) if (!IsDereferenceable(target)) { - AddError(LocalizedErrors.ValueIsNotObjectException()); + AddError(LocalizedErrors.ValueIsNotObjectException(), false); } var node = new NonTerminalNode(NodeKind.IndexAccess, _lastExtractedLexem);