Skip to content

Commit e8011ae

Browse files
committed
Fixed bug with repeat keyword
1 parent c00a9ad commit e8011ae

9 files changed

Lines changed: 4074 additions & 3983 deletions

File tree

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
{
33
"name": "tigerpython-parser",
4-
"version": "1.1.0",
4+
"version": "1.1.3",
55
"description": "Enhanced error recognition in Python ",
66
"main": "release/tigerpython-parser.mjs",
77
"types": "tpParser/js/types/index.d.ts",

release/tigerpython-parser.js

Lines changed: 570 additions & 570 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

release/tigerpython-parser.mjs

Lines changed: 3424 additions & 3411 deletions
Large diffs are not rendered by default.

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,11 @@ class ExpressionParser(val parser: Parser, val parserState: ParserState) {
581581
parserState.reportError(tokens, ErrorCode.WRONG_TOKEN, ".", ",")
582582
tokens.replaceToken(TokenType.COMMA)
583583
base
584+
} else
585+
if (tokens.nonEmpty && tokens.headType == TokenType.REPEAT) {
586+
val token = tokens.next()
587+
val name = AstNode.Name(token.pos, token.value)
588+
parseTrailer(AstNode.Attribute(base.pos, tokens.prevEndPos, base, name), tokens)
584589
} else {
585590
if (tokens.nonEmpty && tokens.headType.category == TokenType.TYPE_KEYWORD)
586591
parserState.reportError(tokens, ErrorCode.CANNOT_USE_KEYWORD_AS_NAME)
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# rowYourBoat.py
2+
# Demonstrates how to build a musical canon.
3+
4+
from music import *
5+
6+
# Create the necessary musical data
7+
rowYourBoatScore = Score("Row Your Boat", 108.0) # tempo is 108 bpm
8+
9+
flutePart = Part(FLUTE, 0) # flute part on channel 0
10+
trumpetPart = Part(TRUMPET, 1) # trumpet part on channel 1
11+
clarinetPart = Part(CLARINET, 2) # clarinet part on channel 2
12+
13+
themePhrase = Phrase(0.0) # theme starts at the beginning
14+
15+
# "Row, row, row your boat gently down the stream"
16+
pitches1 = [C4, C4, C4, D4, E4, E4, D4, E4, F4, G4]
17+
durations1 = [QN, QN, DEN, SN, QN, DEN, SN, DEN, SN, HN]
18+
19+
# "merrily, merrily, merrily, merrily"
20+
pitches2 = [C5, C5, C5, G4, G4, G4, E4, E4, E4, C4,
21+
C4, C4]
22+
durations2 = [ENT, ENT, ENT, ENT, ENT, ENT, ENT, ENT, ENT, ENT,
23+
ENT, ENT]
24+
25+
# "life is but a dream."
26+
pitches3 = [G4, F4, E4, D4, C4]
27+
durations3 = [DEN, SN, DEN, SN, HN]
28+
29+
# add the notes to the theme
30+
themePhrase.addNoteList(pitches1, durations1)
31+
themePhrase.addNoteList(pitches2, durations2)
32+
themePhrase.addNoteList(pitches3, durations3)
33+
34+
# make two new phrases and change start times to make a round
35+
response1Phrase = themePhrase.copy()
36+
response2Phrase = themePhrase.copy()
37+
38+
response1Phrase.setStartTime(4.0) # start after 4 quarter notes
39+
response2Phrase.setStartTime(8.0) # start after 8 quarter notes
40+
41+
# play different parts in different registers
42+
Mod.transpose(themePhrase, 12) # one octave higher
43+
Mod.transpose(response2Phrase, -12) # one octave lower
44+
45+
# play each phrase twice
46+
Mod.repeat(themePhrase, 2)
47+
Mod.repeat(response1Phrase, 2)
48+
Mod.repeat(response2Phrase, 2)
49+
50+
# add phrases to corresponding parts
51+
flutePart.addPhrase(themePhrase)
52+
trumpetPart.addPhrase(response1Phrase)
53+
clarinetPart.addPhrase(response2Phrase)
54+
55+
# add parts to score
56+
rowYourBoatScore.addPart(flutePart)
57+
rowYourBoatScore.addPart(trumpetPart)
58+
rowYourBoatScore.addPart(clarinetPart)
59+
60+
# play score
61+
Play.midi(rowYourBoatScore)
62+
63+
# write score to MIDI file
64+
Write.midi(rowYourBoatScore, "rowYourBoat.mid")
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# 1
2+
# CANNOT_USE_KEYWORD_AS_NAME
3+
repeat = 5
4+
5+
while repeat > 0:
6+
print("*", end="")
7+
repeat -= 1

tpParser/shared/src/test/scala/TestCorrectPrograms.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class TestCorrectPrograms extends FunSuite {
7373
for (fileName <- listAllFiles("correct"))
7474
test("test program '%s'".format(getFileName(fileName))) {
7575
val p = new Parser(loadFromCorrectFile(fileName), getPythonVersion(fileName))
76+
p.repeatStatement = true
7677
val cs = p.checkSyntax()
7778

7879
// In case of an error, we print some extended information to help debugging

tpParser/shared/src/test/scala/TestErroneousPrograms.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class TestErroneousPrograms extends FunSuite {
8585
val (line_no, error_msg, text) = loadFromErrorFile(fileName)
8686
val p = new Parser(text, getPythonVersion(fileName))
8787
p.rejectDeadCode = true
88+
p.repeatStatement = true
8889
p.strictCode = true
8990
val cs = p.checkSyntax()
9091
assert(cs.isDefined)

0 commit comments

Comments
 (0)