Here's a summary of all changes made:
Issue #73: Protocol declaration trailing colon terminator
Files: parser/parser.go
- Added optional colon consumption after IS form (simple/sequential) protocol declarations
- Added optional colon consumption after variant CASE protocol declarations, with DEDENT handling to properly unwind from the nested block back to the protocol's level
Issue #75: CASE with comma-separated match values and ELSE
Files: parser/parser.go
- Added a loop after parsing the first CASE value expression to consume comma-separated additional values (for p.peekTokenIs(lexer.COMMA))
- ELSE was already supported — verified with tests
Issue #78: Parenthesized guard expressions in ALT
Files: ast/ast.go, parser/parser.go, codegen/codegen.go
- Added LPAREN as an accepted first token in parseAltCase() for parenthesized guard expressions
- Added IsSkip field to AltCase struct for guard & SKIP support
- Updated guard parsing to handle SKIP after & (in addition to channel operations)
- Updated codegen to generate default: for SKIP cases and skip nil-channel variable generation for them
Issue #79: Multi-line abbreviations (IS as line continuation)
Files: lexer/lexer.go
- Added IS to isContinuationOp() so NEWLINE/INDENT/DEDENT are suppressed when IS appears at end of line
Tests added (8 new e2e tests):
TestE2E_ProtocolTrailingColon— simple/sequential protocol with trailing:TestE2E_VariantProtocolTrailingColon— variant protocol with trailing:TestE2E_CaseCommaValues— CASE with comma-separated match valuesTestE2E_CaseCommaValuesElse— CASE with comma values and ELSETestE2E_AltWithParenthesizedGuard— ALT with(expr) & channel ? varTestE2E_AltGuardedSkip— ALT withguard & SKIPTestE2E_MultiLineAbbreviation—VAL INT x IS\n 42 :TestE2E_MultiLineAbbreviationExpr— IS continuation with complex expression
All 8 new tests pass, full test suite passes with no regressions, and the course module still transpiles and passes go vet.