Skip to content

Commit 8769741

Browse files
authored
Merge pull request #514 from b3b00/bugfix/513
Bugfix/513
2 parents 93b739c + 6bfe73d commit 8769741

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/sly/parser/parser/llparser/bnf/RecursiveDescentSyntaxParser.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public SyntaxParseResult<IN> SafeParse(IList<Token<IN>> tokens, SyntaxParsingCon
6464
if (rs.Count > 0)
6565
{
6666
result = rs.Find(r => r.IsEnded && !r.IsError);
67-
67+
68+
6869
if (result == null)
6970
{
7071
int lastPosition = -1;
@@ -91,6 +92,19 @@ public SyntaxParseResult<IN> SafeParse(IList<Token<IN>> tokens, SyntaxParsingCon
9192
errors.Add(new UnexpectedTokenSyntaxError<IN>(tokens[lastPosition], LexemeLabels, null));
9293
}
9394
}
95+
else
96+
{
97+
if (result.EndingPosition < tokens.Count-1)
98+
{
99+
SyntaxParseResult<IN> r = new SyntaxParseResult<IN>()
100+
{
101+
IsError = true,
102+
IsEnded = false
103+
};
104+
r.AddErrors(result.GetErrors().ToArray());
105+
return r;
106+
}
107+
}
94108
}
95109

96110
if (result == null)

tests/ParserTests/samples/IndentedWhileTests.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.Linq;
1+
using System.Linq;
32
using csly.indentedWhileLang.compiler;
43
using csly.indentedWhileLang.parser;
54
using csly.whileLang.interpreter;
@@ -9,6 +8,7 @@
98
using sly.lexer;
109
using sly.parser;
1110
using sly.parser.generator;
11+
using sly.parser.generator.visitor;
1212
using Xunit;
1313

1414
namespace ParserTests.samples
@@ -414,9 +414,36 @@ public void TestMissingUIndents()
414414
if false then
415415
x := 28";
416416
var result = parser.Parse(program);
417+
var root = result.Result;
418+
Check.That(root).IsInstanceOf<SequenceStatement>();
419+
var seq = result.Result as SequenceStatement;
420+
var dump = seq.Dump(" ");
421+
Check.That(seq.Statements).CountIs(1);
422+
Check.That(seq.Statements[0]).IsInstanceOf<IfStatement>();
417423
Check.That(result).IsOkParsing();
418424
}
419425

426+
[Fact]
427+
public void TestIssue413_incompleteProgram()
428+
{
429+
var buildResult = buildParser();
430+
var parser = buildResult.Result;
431+
var program = @"
432+
if
433+
";
434+
var result = parser.Parse(program);
435+
Check.That(result).Not.IsOkParsing();
436+
Check.That(result.Errors).CountIs(1);
437+
var error = result.Errors.First();
438+
Check.That(error.ErrorType).IsEqualTo(ErrorType.UnexpectedEOS);
439+
var unexpectedEosError = error as UnexpectedTokenSyntaxError<IndentedWhileTokenGeneric>;
440+
Check.That(unexpectedEosError).IsNotNull();
441+
Check.That(unexpectedEosError.ExpectedTokens.Extracting(x => x.TokenId)).IsEquivalentTo(
442+
IndentedWhileTokenGeneric.MINUS,IndentedWhileTokenGeneric.NOT, IndentedWhileTokenGeneric.QUESTION,
443+
IndentedWhileTokenGeneric.OPEN_PAREN,IndentedWhileTokenGeneric.OPEN_FSTRING,IndentedWhileTokenGeneric.TRUE,
444+
IndentedWhileTokenGeneric.INT,IndentedWhileTokenGeneric.FALSE,IndentedWhileTokenGeneric.IDENTIFIER);
445+
}
446+
420447
[Fact]
421448
public void TestIndentationError_emptyIndentLine()
422449
{

0 commit comments

Comments
 (0)