Files

21 lines
787 B
Plaintext

// 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 /* <Ast.stmt> */ 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); };