$ $ COSC 480 Grammar - 2009 $ From Dr. Harold Grossman's CS 827 $ class, Clemson University $ start -> prog body END prog -> PROGRAM var body -> declpart procpart execpart | declpart execpart $ $ Declarations $ declpart -> DECLARE decllist END decllist -> decllist- decllist- -> decllist- declstat ; | declstat ; declstat -> declstat- declstat- -> declstat- , var | type var | type var int | type var int :: int | type -> INTEGER | REAL $ $ Procedures $ procpart -> proclist proclist -> proclist proc | proc proc -> prochead declpart statlist END | prochead statlist END prochead -> procname null-list | procname fparmlist procname -> PROCEDURE var null-list -> { } fparmlist -> fparmlist- } fparmlist- -> fparmlist- , calltype type var | fparmlist- , calltype type var int | fparmlist- , calltype type var int :: int | { calltype type var | { calltype type var int | { calltype type var int :: int | calltype -> VALUE | REFERENCE $ $ Executable Part $ execpart -> exechead statlist END exechead -> MAIN statlist -> statlist- statlist- -> statlist- stat | stat stat -> whilestat ; | ifstat ; | assignstat ; | inputstat ; | outputstat ; | callstat ; $ inputstat -> inputstat- inputstat- -> inputstat- , var | inputstat- , var [ aexpr ] | inputstat- , var [ aexpr : aexpr ] | INPUT var | INPUT var [ aexpr ] | INPUT var [ aexpr : aexpr ] | $ outputstat -> outputstat- outputstat- -> outputstat- , var | outputstat- , constant | outputstat- , var [ aexpr ] | outputstat- , var [ aexpr : aexpr ] | OUTPUT var | OUTPUT constant | OUTPUT var [ aexpr ] | OUTPUT var [ aexpr : aexpr ] $ callstat -> callname null-list | callname aparmlist callname -> CALL var aparmlist -> aparmlist- } aparmlist- -> aparmlist- , calltype var | aparmlist- , constant | aparmlist- , calltype var [ aexpr ] | aparmlist- , calltype var [ aexpr : aexpr ] | { calltype var | { constant | { calltype var [ aexpr ] | { calltype var [ aexpr : aexpr ] $ ifstat -> ifhead statlist END | ifthen statlist END ifthen -> ifhead statlist ELSE ifhead -> IF ( bexpr ) THEN $ whilestat -> whilehead statlist END whilehead -> WHILE ( bexpr ) DO $ assignstat -> astat astat -> astat- astat- -> var <- aexpr | var [ aexpr ] <- aexpr | var [ aexpr : aexpr ] <- aexpr bexpr -> orexpr orexpr -> orexpr || andexpr | andexpr andexpr -> andexpr- andexpr- -> andexpr- && notexpr | notexpr notexpr -> ! relexpr | relexpr relexpr -> aexpr < aexpr | aexpr <= aexpr | aexpr > aexpr | aexpr >= aexpr | aexpr == aexpr | aexpr != aexpr | aexpr aexpr -> aexpr- aexpr- -> aexpr- + term | aexpr- - term | - term | term term -> term- term- -> term- * primary | term- / primary | primary primary -> ( bexpr ) | constant | var | var [ aexpr ] | var [ aexpr : aexpr ] | constant -> int | real $SP $SPFILE $MARTIN $PFFILE