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 | while_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 ENDIF else_part -> ELSE decl stmt_list | empty cond -> expr compop expr compop -> < | > | = | != | <= | >= /* ECE 468 students use this version of while_stmt */ while_stmt -> WHILE ( cond ) decl stmt_list ENDWHILE /* ECE 573 students use this version of do_while_stmt */ while_stmt -> WHILE ( cond ) decl aug_stmt_list ENDWHILE /* CONTINUE and BREAK statements. ECE 573 students only */ aug_stmt_list -> aug_stmt aug_stmt_list | empty aug_stmt -> base_stmt | aug_if_stmt | while_stmt | CONTINUE; | BREAK; /* Augmented IF statements for ECE 573 students */ aug_if_stmt -> IF ( cond ) decl aug_stmt_list aug_else_part ENDIF 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,ENDIF,WHILE,ENDWHILE,CONTINUE,BREAK, RETURN,INT,VOID,STRING,FLOAT Operators := + - * / = != < > ( ) ; , <= >=