SCM Repository
[diderot] / trunk / src / parser / diderot.grm |
View of /trunk/src/parser/diderot.grm
Parent Directory
|
Revision Log
Revision 27 -
(download)
(annotate)
Tue Feb 9 02:36:31 2010 UTC (12 years, 4 months ago) by jhr
File size: 4738 byte(s)
Tue Feb 9 02:36:31 2010 UTC (12 years, 4 months ago) by jhr
File size: 4738 byte(s)
Working on Diderot parser
(* diderot.grm * * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu) * All rights reserved. *) %name Diderot; %tokens : KW_actor ("actor") | KW_bool ("bool") | KW_die ("die") | KW_else ("else") | KW_field ("field") | KW_if ("if") | KW_image ("image") | KW_input ("input") | KW_int ("int") | KW_kernel ("kernel") | KW_new ("new") | KW_real ("real") | KW_stabilize ("stabilize") | KW_string ("string") | KW_tensor ("tensor") | KW_vec ("vec") | OP_eq ("=") | OP_orelse ("||") | OP_andalso ("&&") | OP_lt ("<") | OP_lte ("<=") | OP_eqeq ("==") | OP_neq ("!=") | OP_gte (">=") | OP_gt (">") | OP_plus ("+") | OP_minus ("-") | OP_star ("*") | OP_slash ("/") | OP_at ("@") | LP ("(") | RP (")") | LB ("[") | RB ("]") | LCB ("{") | RCB ("}") | COMMA (",") | SEMICOLON (";") | HASH ("#") | BANG ("!") | INT of IntInf.int | FLOAT of FloatLit.float | STRING of string | ID of Atom.atom ; %defs ( structure PT = ParseTree structure L = Literal (* apply a mark constructor to a span and a tree *) fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr} (* specialize mark functions for common node types *) val markDecl = mark PT.D_Mark fun markTy (_, e as PT.T_Mark _) = e | markTy (sp, tr) = mark PT.T_Mark (sp, tr) fun markStmt (_, e as PT.S_Mark _) = e | markStmt (sp, tr) = mark PT.S_Mark (sp, tr) fun markExp (_, e as PT.E_Mark _) = e | markExp (sp, tr) = mark PT.E_Mark (sp, tr) fun flatten NONE = [] | flatten (SOME l) = l ); File : Decl+ ; Decl : InputDecl | VarDecl | ActorDecl ; (***** Inputs *****) InputDecl : "input" Type ID ( "=" Expr )? ";" => (markDecl(FULL_SPAN, PT.D_Input(Type, ID, SR))) ; (***** variable declarations *****) VarDecl : Type ID "=" Expr ";" => (mark PT.VD_Mark (FULL_SPAN, PT.VD_Decl(Type, ID, Expr))) ; (***** Actors *****) ActorDecl : "actor" ID "(" Params ")" "{" VarDecl* ActorMethod+ "}" => (markDecl(FULL_SPAN, PT.D_Actor{ name = ID, params = Params, state = VarDecl, methods = ActorMethod })) ; Params : ( Param ( "," Param )* )? => (flatten SR) ; Param : Type ID => (mark PT.P_Mark (FULL_SPAN, PT.P_Param(Type, ID))) ; ActorMethod : ID Block => (mark PT.P_Mark (FULL_SPAN, PT.M_Method(ID, Block))) ; Block : "{" Stmt* "}" => (markStmt(FULL_SPAN, PT.S_Block Stmt)) ; Stmt : AtomicStmt => (AtomicStmt) | %try "if" "(" Expr ")" Stmt "else" Stmt => (markStmt(FULL_SPAN, PT.S_IfThenElse(Expr, Stmt1, Stmt2))) | %try "if" "(" Expr ")" Stmt => (markStmt(FULL_SPAN, PT.S_IfThen(Expr, Stmt))) ; AtomicStmt : Block => (Block) | VarDecl => (PT.S_Decl VarDecl) | "stabilize" ";" => (markStmt(FULL_SPAN, PT.S_Stabilize)) | "die" ";" => (markStmt(FULL_SPAN, PT.S_Die)) | "new" ID "(" Arguments ")" ";" => (markStmt(FULL_SPAN, PT.S_New(ID, Arguments))) | ID "=" Expr ";" => (markStmt(FULL_SPAN, PT.S_Assign(ID, Expr))) ; Arguments : ( Expr ("," Expr)* )? => (flatten SR) ; (***** Types *****) Type : "image" "<" Dimensions ">" => (markTy(FULL_SPAN, PT.T_Image Dimensions)) | "tensor" "<" Dimensions ">" => (markTy(FULL_SPAN, PT.T_Tensor Dimensions)) | "field" "#" Dimension "<" Dimensions ">" => (markTy(FULL_SPAN, PT.T_Field(Dimension, Dimensions))) | "kernel" "#" Dimension => (markTy(FULL_SPAN, PT.T_Kernel Dimension)) | "vec" "<" Dimension ">" => (markTy(FULL_SPAN, PT.T_Vec Dimension)) | "bool" => (markTy(FULL_SPAN, PT.T_Bool)) | "int" => (markTy(FULL_SPAN, PT.T_Int)) | "real" => (markTy(FULL_SPAN, PT.T_Real)) | "string" => (markTy(FULL_SPAN, PT.T_String)) ; Dimensions : ( Dimension ("," Dimension)* )? => (flatten SR) ; Dimension : INT => (INT) ; (***** Expressions *****) Expr : Expr1 ( "||" Expr1 )* ; Expr1 : Expr2 ( "&&" Expr2 )* ; Expr2 : Expr3 ( CmpOp Expr3 )* ; CmpOp : "<" | "<=" | "==" | ">=" | ">" ; Expr3 : Expr4 ( AddOp Expr4 )* ; AddOp : "+" | "-" ; Expr4 : Expr5 ( MulOp Expr5 )* ; MulOp : "*" | "/" ; Expr5 : Expr6 ( "@" Expr6 | "[" Expr "]" )* ; Expr6 : AtomExp => (AtomExp) | "-" Expr6 => (markExpr(FULL_SPAN, PT.E_UnaryOp(uMinus, Expr6))) | "!" Expr6 => (markExpr(FULL_SPAN, PT.E_UnaryOp(bNot, Expr6))) ; AtomExp : ID => (markExpr(FULL_SPAN, PT.E_Var ID)) | INT => (markExpr(FULL_SPAN, PT.E_Lit(L.Int STRING))) | FLOAT => (markExpr(FULL_SPAN, PT.E_Lit(L.Float STRING))) | STRING => (markExpr(FULL_SPAN, PT.E_Lit(L.String STRING))) | "(" Expr ("," Expr)* ")" => (case SR of [] => Expr | l => markExpr(FULL_SPAN, PT.E_Tuple(Expr::l)) (* end case *)) ;
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |