[Mt-daapd-cvs] mt-daapd/src smart-parser.c,1.7,1.8
Status: Beta
Brought to you by:
andrew40
From: Ron P. <rp...@us...> - 2005-10-16 06:56:27
|
Update of /cvsroot/mt-daapd/mt-daapd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6158 Modified Files: smart-parser.c Log Message: start on parsing side Index: smart-parser.c =================================================================== RCS file: /cvsroot/mt-daapd/mt-daapd/src/smart-parser.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** smart-parser.c 14 Oct 2005 04:11:06 -0000 1.7 --- smart-parser.c 16 Oct 2005 06:55:42 -0000 1.8 *************** *** 272,275 **** --- 272,288 ---- * parse a term or phrase into a tree. * + * I'm not a language expert, so I'd suggestions on the + * following production rules: + * + * phrase -> aexpr T_EOF + * aexpr -> oexpr { T_AND oexpr } + * oexpr -> expr { T_OR expr } + * expr -> T_OPENPAREN aexpr T_CLOSEPAREN | criteria + * criteria -> field op value + * + * field -> T_STRINGFIELD, T_INTFIELD, T_DATEFIELD + * op -> T_EQUAL, T_GREATEREQUAL, etc + * value -> T_NUMBER, T_STRING, or T_DATE, as appropriate + * * @param tree parsetree previously created with sp_init * @param term term or phrase to parse *************** *** 282,285 **** --- 295,301 ---- tree->next_token.token_id=T_BOF; sp_scan(tree); + sp_scan(tree); + + while(sp_scan(tree)) { DPRINTF(E_SPAM,L_PARSE,"Got token %04X\n",tree->token.token_id); *************** *** 301,304 **** --- 317,403 ---- } + + /** + * parse for a phrase + * + * phrase -> aexpr T_EOF + * + * @param tree tree we are parsing (and building) + * @returns 1 if successful, 0 otherwise + */ + + int sp_parse_phrase(PARSETREE tree) { + int result=0; + + DPRINTF(E_SPAM,L_PARSE,"Entering sp_parse_phrase\n"); + + if(sp_parse_aexpr(tree) && (tree->token->token_id == T_EOF)) + result=1; + + DPRINTF(E_SPAM,L_PARSE,"Exiting sp_parse_phrase: %s\n",result ? + "success" : "fail"); + + return result; + } + + /** + * parse for an ANDed expression + * + * aexpr -> oexpr { T_AND oexpr } + * + * @param tree tree we are building + * @returns 1 if successful, 0 otherwise + */ + int sp_parse_aexpr(PARSETREE tree) { + int result=0; + + DPRINTF(E_SPAM,L_PARSE,"Entering sp_parse_aexpr\n"); + + while(1) { + result = sp_parse_oexpr(tree); + if((!result) || (tree->token->token_id != T_AND)) break; + } + + DPRINTF(E_SPAM,L_PARSE,"Exiting sp_parse_aexpr: %s\n",result ? + "success" : "fail"); + + return result; + } + + /** + * parse for an ORed expression + * + * oexpr -> expr { T_OR expr } + * + * @param tree tree we are building + * @returns 1 if successful, 0 otherwise + */ + int sp_parse_oexpr(PARSETREE tree) { + int result=0; + + DPRINTF(E_SPAM,L_PARSE,"Entering sp_parse_oexpr\n"); + + while(1) { + result = sp_parse_expr(tree); + if((!result) || (tree->token->token_id != T_OR)) break; + } + + DPRINTF(E_SPAM,L_PARSE,"Exiting sp_parse_oexpr: %s\n",result ? + "success" : "fail"); + + return result; + } + + /** + * parse for an expression + * + * expr -> T_OPENPAREN aexpr T_CLOSEPAREN | criteria + * + * @param tree tree we are building + * @returns 1 if successful, 0 otherwise + */ + int sp_parse_expr(PARSETREE tree) { + } + /** * dispose of an initialized tree |