Skip to content

Commit d89f90b

Browse files
committed
Fixed issue with multiple assignments
1 parent 15a768f commit d89f90b

4 files changed

Lines changed: 52 additions & 6 deletions

File tree

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,24 @@ class ArgumentParser(val parser: Parser, val parserState: ParserState) {
212212
tokens.next()
213213
matchComa(tokens)
214214
SlashParameter(pos) :: parseParameters(tokens, allowTypes)
215+
case TokenType.ASSIGN =>
216+
val pos = tokens.pos
217+
tokens.next()
218+
if (tokens.hasType(TokenType.RIGHT_PARENS, TokenType.COMMA)) {
219+
parserState.reportError(pos, ErrorCode.EXTRA_TOKEN, "=")
220+
if (matchComa(tokens))
221+
SimpleParameter(pos, "", null) :: parseParameters(tokens, allowTypes)
222+
else
223+
SimpleParameter(pos, "", null) :: Nil
224+
} else {
225+
parserState.reportError(pos, ErrorCode.NAME_EXPECTED)
226+
val defStart = tokens.pos
227+
val defExpr = expressionParser.parseTest(tokens)
228+
val defEnd = tokens.pos
229+
val result = DefaultParameter(pos, "", defExpr, tokens.textSource.subSequence(defStart, defEnd).toString.trim, null)
230+
matchComa(tokens)
231+
result :: parseParameters(tokens, allowTypes)
232+
}
215233
case _ =>
216234
val name = parseKeywordName(tokens)
217235
if (name == null) {
@@ -226,6 +244,14 @@ class ArgumentParser(val parser: Parser, val parserState: ParserState) {
226244
val defStart = tokens.pos
227245
val defExpr = expressionParser.parseTest(tokens)
228246
val defEnd = tokens.pos
247+
if (tokens.matchType(TokenType.ASSIGN)) {
248+
if (tokens.hasType(TokenType.COMMA, TokenType.RIGHT_PARENS))
249+
parserState.reportError(tokens.prevPos, ErrorCode.EXTRA_TOKEN, "=")
250+
else {
251+
parserState.reportError(tokens.prevPos, ErrorCode.MISPLACED_ASSIGN, "=")
252+
expressionParser.parseTest(tokens)
253+
}
254+
}
229255
DefaultParameter(name.pos, name.name, defExpr, tokens.textSource.subSequence(defStart, defEnd).toString.trim, annot)
230256
}
231257
else

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ class ExpressionParser(val parser: Parser, val parserState: ParserState) {
471471

472472
protected def parseArithExpr(tokens: TokenBuffer): Expression = {
473473
var result = parseTerm(tokens)
474-
while (tokens.hasType(TokenType.PLUS, TokenType.MINUS)) {
474+
while (tokens.hasType(TokenType.PLUS, TokenType.MINUS) && result != null) {
475475
val op = BinOp.fromTokenType(tokens.next().tokenType)
476476
result = AstNode.BinaryOp(result.pos, op, result, parseTerm(tokens))
477477
}
@@ -481,7 +481,7 @@ class ExpressionParser(val parser: Parser, val parserState: ParserState) {
481481
protected def parseTerm(tokens: TokenBuffer): Expression = {
482482
var result = parseFactor(tokens)
483483
while (tokens.hasType(TokenType.STAR, TokenType.DIV, TokenType.INT_DIV, TokenType.MOD,
484-
TokenType.ANNOTATION)) {
484+
TokenType.ANNOTATION) && result != null) {
485485
val op = BinOp.fromTokenType(tokens.next().tokenType)
486486
result = AstNode.BinaryOp(result.pos, op, result, parseFactor(tokens))
487487
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# 1
2+
# MISPLACED_ASSIGN
3+
def garage(screws=+nails=+washers):
4+
print("Final price is: " screws=+nails=+washers)
5+
6+
screws = 123

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,33 @@ class DebugTester extends FunSuite {
1414
}
1515

1616
private val PROGRAM: String =
17-
"""import turtle
18-
|turtle.""".stripMargin
17+
"""def foo(x=+y=+z):
18+
| print(x)
19+
|
20+
|x = 123""".stripMargin
1921

2022
{
21-
val pyiSource = loadFromFile("./tpParser/shared/src/test/programs/completer/typeshed/turtle.pyi")
23+
/* val pyiSource = loadFromFile("./tpParser/shared/src/test/programs/completer/typeshed/turtle.pyi")
2224
ModuleLoader.addPyiModule("turtle", pyiSource)
2325
val completer = new Completer("<module>", PROGRAM, PROGRAM.length)
24-
val nameFilter = completer.getNameFilter
26+
val nameFilter = completer.getNameFilter*/
2527
/*if (nameFilter != null) {
2628
val suggestions = nameFilter.getNameList("")
2729
println(suggestions.mkString(";"))
2830
println("– done –")
2931
} else
3032
println("– no entries –")*/
33+
/*val p = new Parser(PROGRAM)
34+
p.repeatStatement = true
35+
val cs = p.checkSyntax()
36+
if (cs.nonEmpty) {
37+
val pos = cs.get.position
38+
println("ERROR")
39+
println(PROGRAM.slice(0, pos))
40+
println("???")
41+
println(PROGRAM.slice(pos, PROGRAM.length))
42+
}
43+
assert(cs.isEmpty)
44+
print("DONE")*/
3145
}
3246
}

0 commit comments

Comments
 (0)