void test_maths(void) { mpc_parser_t *Expr, *Factor, *Term, *Maths; int r0 = 1, r1 = 5, r2 = 13, r3 = 0, r4 = 2; Expr = mpc_new("expr"); Factor = mpc_new("factor"); Term = mpc_new("term"); Maths = mpc_new("maths"); mpc_define(Expr, mpc_or(2, mpc_and(3, mpcf_maths, Factor, mpc_oneof("*/"), Factor, free, free), Factor )); mpc_define(Factor, mpc_or(2, mpc_and(3, mpcf_maths, Term, mpc_oneof("+-"), Term, free, free), Term )); mpc_define(Term, mpc_or(2, mpc_int(), mpc_parens(Expr, free) )); mpc_define(Maths, mpc_whole(Expr, free)); PT_ASSERT(mpc_test_pass(Maths, "1", &r0, int_eq, free, int_print)); PT_ASSERT(mpc_test_pass(Maths, "(5)", &r1, int_eq, free, int_print)); PT_ASSERT(mpc_test_pass(Maths, "(4*2)+5", &r2, int_eq, free, int_print)); PT_ASSERT(mpc_test_fail(Maths, "a", &r3, int_eq, free, int_print)); PT_ASSERT(mpc_test_fail(Maths, "2b+4", &r4, int_eq, free, int_print)); mpc_cleanup(4, Expr, Factor, Term, Maths); }
int main(int argc, char** argv) { /* Build a new parser, 'Adjective' to recognise descriptions */ mpc_parser_t* Adjective = mpc_or(4, mpc_sym("wow"), mpc_sym("many"), mpc_sym("so"), mpc_sym("such") ); /* Build a new parser, 'Noun' to recognise things */ mpc_parser_t* Noun = mpc_or(5, mpc_sym("lisp"), mpc_sym("language"), mpc_sym("c"), mpc_sym("book"), mpc_sym("build") ); mpc_parser_t* Phrase = mpc_and(2, mpcf_strfold, Adjective, Noun, free); mpc_parser_t* Doge = mpc_many(mpcf_strfold, Phrase); /* do some parsing here... */ mpc_delete(Doge); return 0; }
int main (int argc, char** argv) { //build a parser named: "Adjective" to recognize descriptions mpc_parser_t* Adjective = mpc_or(4, mpc_sym("wow"), mpc_sym("many"), mpc_sym("so"), mpc_sym("such") ); //build a parser named: "Noun" to recognize things mpc_parser_t* Noun = mpc_or(5, mpc_sym("lisp"), mpc_sym("language"), mpc_sym("book"), mpc_sym("build"), mpc_sym("c") ); //Creating our phrase parser to combine nouns and adjectives //the mpc_and function means one thing is required AND THEN another mpc_parser_t* Phrase = mpc_and(2, mpcf_strfold, Adjective, Noun, free); //... mpc_parser_t* Doge = mpc_many(mpcf_strfold, Phrase); /*DO SOME PARSING HERE*/ mpc_delete(Doge); return 0; }
void test_ident(void) { /* ^[a-zA-Z_][a-zA-Z0-9_]*$ */ mpc_parser_t* Ident = mpc_whole( mpc_and(2, mpcf_strfold, mpc_or(2, mpc_alpha(), mpc_underscore()), mpc_many1(mpcf_strfold, mpc_or(3, mpc_alpha(), mpc_underscore(), mpc_digit())), free), free ); PT_ASSERT(mpc_test_pass(Ident, "test", "test", string_eq, free, string_print)); PT_ASSERT(mpc_test_fail(Ident, " blah", "", string_eq, free, string_print)); PT_ASSERT(mpc_test_pass(Ident, "anoth21er", "anoth21er", string_eq, free, string_print)); PT_ASSERT(mpc_test_pass(Ident, "du__de", "du__de", string_eq, free, string_print)); PT_ASSERT(mpc_test_fail(Ident, "some spaces", "", string_eq, free, string_print)); PT_ASSERT(mpc_test_fail(Ident, "", "", string_eq, free, string_print)); PT_ASSERT(mpc_test_fail(Ident, "18nums", "", string_eq, free, string_print)); mpc_delete(Ident); }
/* Build a new parser Adjective to recognize descriptions */ mpc_parser_t* Adjective = mpc_or(4, mpc_sym("wow"), mpc_sym("many"), mpc_sym("so"), mpc_sym("such") ); /* Build a new parser 'Noun to recognize' things*/ mpc_parser_t* Noun = mpc_or(5 mpc_sym("lisp"), mpc_sym("language"), mpc_sym("c"), mpc_sym("book"), mpc_sym("build") ); mpc_parser_t* Phrase = mpc_and(2, mpcf_strfold, Adjective, Noun, free); mpc_parser_t* Doge = mpc_many(mpcf_strfold, Phrase); // Natural grammar mpc_parser_t* Adjective = mpc_new("adjective"); mpc_parser_t* Noun = mpc_new("noun"); mpc_parser_t* Phrase = mpc_new("Phrase"); mpc_parser_t* Doge = mpc_new("doge"); mpca_lang(MPC_LANG_DEFAULT, "adjective : \"wow\" | \"many\" | \"so\" | \"such\"; \ noun : \"lisp\" | \"language\" | \"c\" | \"book\" | \"build\"; \ phrase : <adjective> <noun>; \ doge : <phrase>*; \