At the start, your team can set up an overall plan for the prototype development.
Schedule Sprint 0 planning meeting
Agenda
Allocate responsibilities to team members
Set up communication channels
Agree on project management tool (Jira or GitHub)
If Jira, add Lecturer, TA and tutor to the account
Fix time for a weekly meeting within the team
Fix a 15 mins slot for standup (may be 3-4 days after tutorial where you have one standup happening with tutor so that these are equally spanned)
Fix a time (immediately after demo with tutor on last day of sprint) for sprint retrospective (20 mins will be good)
Spend time on understanding about SPA
Spend time for research on Design considerations (which design pattern could be good and why)
Come up with abstract APIs for the PKB and Query Evaluator
Then, your team can:
Consider writing system acceptance test cases before development
Your SPA prototype should pass these system acceptance tests at the end of the iteration.
Each test case should consist of a SIMPLE source code, a set of PQL queries, with test description and their expected results.
Develop SPA prototype
Run system acceptance tests
Document details as you evolve (for report)
A feature is considered as developed and completed only when it is fully tested.
Write as many unit tests as needed for each function written.
Automate running test cases (saves lots of time).
Peer review is very important
We will test your SPA at the end of the project using AutoTester. Plan for testing (and other quality controls such as reviews), and let quality control be an integral part of your implementation approach.
Plan to spend 1/3 of your effort on testing.
Store your test cases so that you can replay them as needed. Use AutoTester for regression testing (automatically replaying system tests).
Write system acceptance tests before you start development of the SPA prototype.
Test your Source Processor on a variety of SIMPLE source code.
Test each type of query conditions (g., Follows, Modifies and pattern) and various combinations of query conditions (e.g., Follows + pattern and Modifies + pattern) that are allowed in the prototype.
Write unit and integration tests as soon as you start writing code. Some tests may be written even before you write code, based on the given requirements.
For the source parser:
Consider implementing a predictive (recursive descent, top-down) parser, which is the simplest solution for the prototype.
Print meaningful error messages and terminate parser execution when it encounters the first error in the source program.
Use the sample SIMPLE source code from Downloads to verify that your parser is able to parse a relatively simple source code. Note that a successful parse does not guarantee its correctness.
For generating VarTable:
Write concrete VarTable APIs (a public interface for a class implementing VarTable), based on the abstract VarTable APIs.
Choose a data representation for VarTable, justify your choice, and implement its public interface operations.
For generating AST / information related to AST:
Write concrete AST APIs (a public interface for a class implementing AST), based on the abstract AST APIs.
Implement AST generation actions in polynomial time (PTIME).
Choose a data representation for AST, justify your choice, and implement its public interface operations.
For generating information related to Modifies and Uses relationships between statements:
Write concrete Modifies APIs (a public interface for a class implementing Modifies/Uses), based on the abstract Modifies/Uses APIs.
Choose a data representation for Modifies, justify your choice, and implement its public interface operations.
Repeat the above steps for Uses relationship.
Write down validation rules for queries.
Split Query Processor into Query Preprocessor and Query Evaluator.
Implement Query Preprocessor in a similar way as the parser for SIMPLE.
Implement Query Evaluator.