/* $Id$ * * This is LL(1) grammar for LFC based on the "Introduction to LFC Programming * Language" (January 25, 2008) by Zhen Lixiao */ %token SC COLON COMMA %token DEC VAR DEF %token ASTERISK TO EQ %token LPAR RPAR %token IDENTIFIER STRING UNDEFINED %token CONCAT %token IF THEN ELSE WHERE %% program : function_dec var_dec_and_func_def program_rest ; program_rest : /*empty*/ | program ; function_dec : DEC funname COLON function_type SC ; var_dec_and_func_def : variable_dec definition | definition ; variable_dec : VAR vars_decl variable_dec_rest ; vars_decl : variable_list COLON concept_name SC ; variable_dec_rest : /*empty*/ | vars_decl variable_dec_rest ; variable_list : variable variable_list_rest ; variable_list_rest : /*empty*/ | COMMA variable variable_list_rest ; definition : DEF equation equation_rest ; equation : funname LPAR pattern_list RPAR EQ exp_with_where_or_undef SC ; equation_rest : /*empty*/ | equation equation_rest ; pattern_list : pattern pattern_list_rest ; pattern : STRING pat_concat | variable pat_concat ; pat_concat : /*empty*/ | CONCAT pattern ; pattern_list_rest : /*empty*/ | COMMA pattern pattern_list_rest ; function_type : concept_name concept_list_rest TO concept_name ; concept_list_rest : /*empty*/ | ASTERISK concept_name concept_list_rest ; concept_name : IDENTIFIER ; funname : IDENTIFIER ; variable : IDENTIFIER ; exp : STRING exp_concat | IDENTIFIER exp_var_or_func exp_concat | LPAR exp_with_where RPAR exp_concat | IF exp THEN exp ELSE exp ; exp_with_where : STRING exp_concat_or_where | IDENTIFIER exp_var_or_func exp_concat_or_where | LPAR exp_with_where RPAR exp_concat_or_where | IF exp_with_where THEN exp_with_where ELSE exp_with_where ; exp_with_where_or_undef : UNDEFINED | exp_with_where ; exp_var_or_func : /*empty*/ | LPAR arg_list RPAR ; arg_list : /*empty*/ | exp arg_list_rest ; arg_list_rest : /*empty*/ | COMMA exp arg_list_rest ; exp_concat : /*empty*/ | CONCAT exp ; exp_concat_or_where : /*empty*/ | CONCAT exp_with_where | WHERE varassign_list ; varassign_list : variable EQ exp varassign_rest ; varassign_rest : /*empty*/ | COMMA varassign_list ;