ROSE Compiler Framework/Processing Pragmas

overview edit

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:

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.

Parsing recursive rules edit

left recursion

recursion rules are converted into repetition rules:

  /* YACC left recursion rule
     : assignment_expression
     | argument_expression_list ',' assignment_expression

     Or in ANTLR as repetition
     : 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;
    { // 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()
        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;