ROSE Compiler Framework/Processing Pragmas
overview
editIt is often useful to use pragmas to guide a translator.
A set of parser building functions are provided to help create recursive descent parsers:
Once you include the header AstFromString.h (located in src/frontend/SageIII/astFromString), you can access the variables and functions defined in the namespace.
There is an example project doing pragma parsing and saving the results into AST attributes. https://github.com/rose-compiler/rose-develop/tree/master/projects/pragmaParsing
Parsing recursive rules
editleft recursion
recursion rules are converted into repetition rules:
/* YACC left recursion rule argument_expression_list : assignment_expression | argument_expression_list ',' assignment_expression Or in ANTLR as repetition argument_expression_list : assignment_expression (',' assignment_expression)* ; */ bool afs_match_argument_expression_list() { bool result =false; const char* old_char = c_char; SgExprListExp* parameters = NULL; if (afs_match_assignment_expression()) { SgExpression* arg1 = isSgExpression(c_parsed_node); assert (arg1 != NULL); parameters = buildExprListExp(arg1); c_parsed_node = parameters; result = true; } else { // immediate return false when first required term is not matched c_char = old_char; return false; } // match optional additional expressions old_char = c_char; // set rollback point while (afs_match_char(',')) { if (afs_match_assignment_expression()) { SgExpression* argx = isSgExpression(c_parsed_node); assert(argx != NULL); appendExpression(parameters, argx); c_parsed_node = parameters; // must set it again since it was rewritten in match_assignment_expression() } else { c_char = old_char; // optional match fails, rollback // printf("error. afs_match_argument_expression_list() expects assignment_expression after matching ','\n"); // assert (0); break; // and break out } // prepare next round old_char = c_char; } assert (parameters != NULL); // c_parsed_node = parameters; // this is necessary since the while loop may rewrite c_parsed_node assert (c_parsed_node == parameters); return true; }