One of the bugs still in the Waterloo Course Planner is the handling of prerequisite sentences that end with “* students only.”. The fix I made was rather simple. Though converting existing test cases to unit tests did not help because none of the older grammar rules were changed and therefore the tests were not broken, it did help in the development of new grammar rules. Python unit tests does a nice job of pinpointing the exact place where the expected results differ from running the code.
Traceback (most recent call last):
File "N:\Projects\ply\prereqyacc.py", line 182, in testQuirks
self.assertEqual(results, map(parser.parse, prereqs))
AssertionError: Lists differ: ['MATH 127/MATH 128/MATH 137/M... != ['MATH 127/MATH 128/MATH 137/M...
First differing element 1:
MATH 115/MATH 119
MATH 115, MATH 119
- ['MATH 127/MATH 128/MATH 137/MATH 147', 'MATH 115/MATH 119']
+ ['MATH 127/MATH 128/MATH 137/MATH 147', 'MATH 115, MATH 119']
“* students only.” appearing in a string results in the tokenizer printing out a list of invalid tokens. There are two ways of ignoring strings in PLY:
- t_ignore_ in the tokenizer
- change t_ignore_ to a token and add a new rule that returns an empty string in the parser
I used the second method this time, since the semicolon preceding “* students only.” would also need to be ignored. Semicolons are treated as a signal for an “and” clause otherwise. The new rule looks like the following:
'semi_restriction : SEMI STUDENTS_ONLY'
p = ''