Program Parser v4
Program Parser v4
Parse tokens into an AST for the v4 language (for loops, break/continue, && / ||).
Function signature
func Parse(tokens []Token) (*Program, error)
Grammar
program -> stmt* EOF
stmt -> varDecl
| ifStmt
| whileStmt
| forStmt
| breakStmt
| continueStmt
| returnStmt
| block
| fnDecl
| assignOrExpr
fnDecl -> "fn" IDENT "(" params? ")" block
params -> IDENT ("," IDENT)*
varDecl -> ("let" | "var" | "const") IDENT ("=" expr)? ";"
assignOrExpr-> expr ("=" expr)? ";"
block -> "{" stmt* "}"
ifStmt -> "if" "(" expr ")" block ("else" block)?
whileStmt -> "while" "(" expr ")" block
forStmt -> "for" "(" forInit? ";" expr? ";" forPost? ")" block
forInit -> varDeclNoSemi | assignOrExprNoSemi
forPost -> assignOrExprNoSemi
breakStmt -> "break" ";"
continueStmt-> "continue" ";"
returnStmt -> "return" expr? ";"
expr -> or
or -> and ("||" and)*
and -> equality ("&&" equality)*
equality -> comparison ( ("==" | "!=") comparison )*
comparison -> term ( ("<" | "<=" | ">" | ">=") term )*
term -> factor ( ("+" | "-") factor )*
factor -> unary ( ("*" | "/") unary )*
unary -> ("!" | "-") unary | postfix
postfix -> primary ("(" args? ")" | "[" expr "]")*
args -> expr ("," expr)*
primary -> NUMBER | STRING | TRUE | FALSE | NIL | IDENT
| "(" expr ")"
| array
| map
array -> "[" (expr ("," expr)*)? "]"
map -> "{" (pair ("," pair)*)? "}"
pair -> expr ":" expr
AST shape
Use the provided structs:
ProgramwithStmts []*StmtStmtwith fields:Kind,VarKind,Name,Expr,Target,Body,Else,Params,Init,Post,CondExprwith fields:Kind,Value,Left,Right,Args,Elems,PairsMapPairwithKey,Value
Rules
- Functions are statements and can appear in any block.
- An assignment statement must have a valid target: identifier or index expression.
forstatements with omittedcondare infinite loops unlessbreak/returnexists in body.breakandcontinueare only accepted when parser context is within a loop in a full pipeline.
Errors
Return a non-nil error if:
- tokens do not match the grammar
- parentheses or braces are unbalanced
- an assignment target is not valid
- extra tokens remain after parsing
Before implementation
Use the module’s worked reconstruction and independent debugging lab to predict an intermediate artifact first. Preserve one failing counterexample while implementing the stated API. The lesson’s transfer task uses a fresh case after the guided trace.
Run tests to see results
No issues detected