Skip to content

Commit e089086

Browse files
authored
Merge pull request #1688 from Mr-Rm/v2/fix-1685
fix #1685: обработка ошибок в теле модуля
2 parents 3c3984c + de17102 commit e089086

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

src/OneScript.Language/SyntaxAnalysis/DefaultBslParser.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ private bool BuildDefaultParameterValue(NonTerminalNode param, NodeKind nodeKind
516516

517517
private void BuildModuleBody()
518518
{
519-
if (!_lexer.Iterator.MoveToContent())
519+
if (_lastExtractedLexem.Token == Token.EndOfText)
520520
return;
521521

522522
var moduleBody = new NonTerminalNode(NodeKind.ModuleBody, _lastExtractedLexem);
@@ -746,7 +746,11 @@ private void BuildComplexStructureStatement()
746746
}
747747
else
748748
{
749-
AddError(LocalizedErrors.TokenExpected(_tokenStack.Peek()));
749+
var expected = _tokenStack.Peek();
750+
if (expected.Length == 1 && expected[0] == Token.EndOfText)
751+
AddError(LocalizedErrors.UnexpectedKeyword(_lastExtractedLexem.Token));
752+
else
753+
AddError(LocalizedErrors.TokenExpected(expected));
750754
}
751755
break;
752756
}
@@ -1552,7 +1556,9 @@ private void SkipToNextStatement(Token[] additionalStops = null)
15521556
private void AddError(CodeError err, bool doFastForward = true)
15531557
{
15541558
err.Position = _lexer.GetErrorPosition();
1555-
err.Position.ColumnNumber -= _lastExtractedLexem.Content?.Length ?? 1;
1559+
var adjustColumn = _lastExtractedLexem.Content?.Length ?? 1;
1560+
if (err.Position.ColumnNumber >= adjustColumn)
1561+
err.Position.ColumnNumber -= adjustColumn;
15561562
ErrorSink.AddError(err);
15571563

15581564
if (doFastForward)

src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ public static CodeError AwaitMustBeInAsyncMethod() => Create(
8080

8181
public static CodeError NumberExpected() => Create("Ожидается числовая константа", "Numeric constant expected");
8282

83+
public static CodeError UnexpectedKeyword(Token unexpected) => Create(
84+
$"Неожиданное ключевое слово: {LanguageDef.GetTokenName(unexpected)}",
85+
$"Unexpected keyword: {LanguageDef.GetTokenAlias(unexpected)}");
86+
8387
public static CodeError UnexpectedEof() =>
8488
Create("Неожиданный конец модуля", "Unexpected end of text");
8589

src/Tests/OneScript.Language.Tests/ParserTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,8 +1609,24 @@ public void Async_And_Await_Are_Ordinary_Identifiers_In_NonAsync_Scope()
16091609
var asyncNode = validator.NextChild().Is(NodeKind.Assignment)
16101610
.NextChildIs(NodeKind.Identifier)
16111611
.ChildItself().Value.Should().Be("Асинх");
1612+
}
1613+
1614+
[Fact]
1615+
public void Throws_When_Error_In_Module_Body()
1616+
{
1617+
var code = @"Function F()
1618+
Return 0
1619+
EndFunction
1620+
EndFunction";
1621+
1622+
var parser = PrepareParser(code);
1623+
parser.ParseStatefulModule();
1624+
1625+
parser.Errors.Should().NotBeEmpty("Expression syntax error");
1626+
parser.Errors.First().ErrorId.Should().Be("UnexpectedKeyword");
16121627
}
16131628

1629+
16141630
private static void CatchParsingError(string code)
16151631
{
16161632
var parser = PrepareParser(code);

0 commit comments

Comments
 (0)