Ejemplo n.º 1
0
Archivo: core.c Proyecto: cyendra/mpc
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;

}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
0
Archivo: core.c Proyecto: cyendra/mpc
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);

}
Ejemplo n.º 5
0
/* 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>*;                                              \