Skip to content

Commit b8b8bb2

Browse files
committed
Improved errors for if:
1 parent c9fa3e0 commit b8b8bb2

File tree

5 files changed

+31
-7
lines changed

5 files changed

+31
-7
lines changed

tpParser/shared/src/main/scala/tigerpython/parser/parsing/ExpressionParser.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,18 @@ class ExpressionParser(val parser: Parser, val parserState: ParserState) {
410410
while (tokens.hasType(TokenType.EQ, TokenType.NEQ, TokenType.IS, TokenType.IS_NOT,
411411
TokenType.LEQ, TokenType.LESS, TokenType.IN, TokenType.NOT_IN,
412412
TokenType.GEQ, TokenType.GREATER)) {
413-
val op = BinOp.fromTokenType(tokens.next().tokenType)
413+
val op: BinOp.Value =
414+
if (tokens.hasType(TokenType.IS, TokenType.IS_NOT) && tokens.peekType(1) == TokenType.IN) {
415+
val invert = tokens.headType == TokenType.IS_NOT
416+
parserState.reportError(tokens.pos, ErrorCode.EXTRA_TOKEN, "is")
417+
tokens.next()
418+
tokens.next()
419+
if (invert)
420+
BinOp.CMP_NOT_IN
421+
else
422+
BinOp.CMP_IN
423+
} else
424+
BinOp.fromTokenType(tokens.next().tokenType)
414425
result += ((op, parseExpr(tokens)))
415426
}
416427
if (result.nonEmpty)
@@ -763,7 +774,7 @@ class ExpressionParser(val parser: Parser, val parserState: ParserState) {
763774
val test =
764775
if (tokens.headType == TokenType.COMMA) {
765776
parserState.reportError(tokens, ErrorCode.MISSING_EXPRESSION)
766-
null
777+
AstNode.EmptyExpression(tokens.pos)
767778
} else
768779
parseTest(tokens)
769780
if (tokens.hasType(TokenType.FOR)) {

tpParser/shared/src/main/scala/tigerpython/parser/parsing/Parser.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,8 +1233,14 @@ class Parser(val source: CharSequence,
12331233
val tokens = line.tokenSource
12341234
tokens.next()
12351235
val test = if (tokens.hasType(TokenType.COLON)) {
1236-
parserState.reportError(tokens.pos, ErrorCode.MISSING_COMPARISON)
1237-
AstNode.EmptyExpression(tokens.pos)
1236+
if (tokens.remaining > 1 && expressionParser.firstOfTest(tokens.peek(1)) && (tokens.hasColonAtEnd || line.hasSuite)) {
1237+
parserState.reportError(tokens.pos, ErrorCode.EXTRA_TOKEN, ":")
1238+
tokens.next()
1239+
expressionParser.parseCmpTest(tokens)
1240+
} else {
1241+
parserState.reportError(tokens.pos, ErrorCode.MISSING_COMPARISON)
1242+
AstNode.EmptyExpression(tokens.pos)
1243+
}
12381244
} else
12391245
expressionParser.parseCmpTest(tokens)
12401246
if (tokens.hasNext && tokens.head.tokenType != TokenType.COLON && line.hasSuite && tokens.hasColonAtEnd) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 1
2+
# MISSING_COMPARISON
3+
if:
4+
pass
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 1
2+
# EXTRA_TOKEN
3+
if: x < 5:
4+
print(x)

tpParser/shared/src/test/scala/DebugTester.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ class DebugTester extends FunSuite {
1414
}
1515

1616
private val PROGRAM: String =
17-
"""my_list = [,,,]
18-
|
19-
|print(my_list)
17+
"""if:
18+
| pass
2019
|""".stripMargin
2120

2221
{

0 commit comments

Comments
 (0)