// This example shows how to write a parser file which creates // nodes that carry F# values. %parser lang.lexer LangParse %symbol Prog { public Ast.prog v; } %symbol Stmt { internal Ast.stmt v; } %symbol StmtList { internal FS.list /* */ v; } Prog : StmtList { v = Ast.prog.MkProg($1.v); }; Stmt : ID ASSIGN ID { v = Ast.stmt.MkAssign($1.yytext,$3.yytext); } | WHILE ID DO Stmt { v = Ast.stmt.MkWhile($2.yytext,$4.v); } | BEGIN StmtList END { v = Ast.stmt.MkSeq($2.v); } | IF ID THEN Stmt { v = Ast.stmt.MkIfThen($2.yytext,$4.v); } | IF ID THEN Stmt ELSE Stmt { v = Ast.stmt.MkIfThenElse($2.yytext,$4.v,$6.v); }; StmtList: Stmt { v = FS.list.MkCons($1.v,FS.list.MkNil()); } | StmtList SEMI Stmt { v = FS.list.MkCons($3.v, $1.v); };