ROSE Compiler Framework/Processing Pragmas

overview
It is often useful to use pragmas to guide a translator.

A set of parser building functions are provided to help create recursive descent parsers:
 * http://rosecompiler.org/ROSE_HTML_Reference/namespaceAstFromString.html

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
left 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; }