21 lines
787 B
Plaintext
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); };
|
|
|
|
|