CAPS : CAPS is a token (terminal) made up of one or more characters. small case symbols are non-terminals. /* Program */ program -> PROGRAM id BEGIN pgm_body END id -> IDENTIFIER pgm_body -> decl func_declarations decl -> string_decl decl | var_decl decl | empty /* Global String Declaration */ string_decl -> STRING id := str ; str -> STRINGLITERAL /* Variable Declaration */ var_decl -> var_type id_list ; var_type -> FLOAT | INT any_type -> var_type | VOID id_list -> id id_tail id_tail -> , id id_tail | empty /* Function Paramater List */ param_decl_list -> param_decl param_decl_tail | empty param_decl -> var_type id param_decl_tail -> , param_decl param_decl_tail | empty /* Function Declarations */ func_declarations -> func_decl func_declarations | empty func_decl -> FUNCTION any_type id (param_decl_list) BEGIN func_body END func_body -> decl stmt_list /* Statement List */ stmt_list -> stmt stmt_list | empty stmt -> base_stmt | if_stmt | for_stmt base_stmt -> assign_stmt | read_stmt | write_stmt | return_stmt /* Basic Statements */ assign_stmt -> assign_expr ; assign_expr -> id := expr read_stmt -> READ ( id_list ); write_stmt -> WRITE ( id_list ); return_stmt -> RETURN expr ; /* Expressions */ expr -> expr_prefix factor expr_prefix -> expr_prefix factor addop | empty factor -> factor_prefix postfix_expr factor_prefix -> factor_prefix postfix_expr mulop | empty postfix_expr -> primary | call_expr call_expr -> id ( expr_list ) expr_list -> expr expr_list_tail | empty expr_list_tail -> , expr expr_list_tail | empty primary -> ( expr ) | id | INTLITERAL | FLOATLITERAL addop -> + | - mulop -> * | / /* Complex Statements and Condition */ if_stmt -> IF ( cond ) decl stmt_list else_part FI else_part -> ELSE decl stmt_list | empty cond -> expr compop expr compop -> < | > | = | != | <= | >= init_stmt -> assign_expr | empty incr_stmt -> assign_expr | empty /* ECE 468 students use this version of for_stmt */ for_stmt -> FOR ( init_stmt ; cond ; incr_stmt ) decl stmt_list ROF /* ECE 573 students use this version of for_stmt */ for_stmt -> FOR ( init_stmt ; cond ; incr_stmt ) decl aug_stmt_list ROF /* CONTINUE and BREAK statements. ECE 573 students only */ aug_stmt_list -> aug_stmt aug_stmt_list | empty aug_stmt -> base_stmt | aug_if_stmt | for_stmt | CONTINUE; | BREAK; /* Augmented IF statements for ECE 573 students */ aug_if_stmt -> IF ( cond ) decl aug_stmt_list aug_else_part FI aug_else_part -> ELSE decl aug_stmt_list | empty ------ an IDENTIFIER token will begin with a letter, and be followed by any number of letters and numbers. IDENTIFIERS are case sensitive. INTLITERAL: integer number ex) 0, 123, 678 FLOATLITERAL: floating point number available in two different format yyyy.xxxxxx or .xxxxxxx ex) 3.141592 , .1414 , .0001 , 456.98 STRINGLITERAL: any sequence of characters except '"' between '"' and '"' ex) "Hello world!" , "***********" , "this is a string" COMMENT: Starts with "--" and lasts till the end of line ex) -- this is a comment ex) -- any thing after the "--" is ignored Keywords PROGRAM,BEGIN,END,FUNCTION,READ,WRITE, IF,ELSE,FI,FOR,ROF,CONTINUE,BREAK, RETURN,INT,VOID,STRING,FLOAT Operators := + - * / = != < > ( ) ; , <= >=